<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    konhon

    忘掉過去,展望未來。找回自我,超越自我。
    逃避不一定躲的過, 面對不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因為某個理由而傷心難過, 但我卻能找個理由讓自己快樂.

    Google

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

    #

    批量刪除海量數據通常都是很復雜及緩慢的,方法也很多,但是通常的概念是:分批刪除,逐次提交。
    下面是我的刪除過程,我的數據表可以通過主鍵刪除,測試過Delete和For all兩種方法,for all在這里并沒有帶來性能提高,所以仍然選擇了批量直接刪除。

    首先創建一下過程,使用自制事務進行處理:

    create or replace procedure delBigTab
    (
    p_TableName       in    varchar2,
    p_Condition       in    varchar2,
    p_Count        in    varchar2
    )
    as
    pragma autonomous_transaction;
    n_delete number:=0;
    begin
    while 1=1 loop
    EXECUTE IMMEDIATE
    'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
    USING p_Count;
    if SQL%NOTFOUND then
    exit;
    else
    n_delete:=n_delete + SQL%ROWCOUNT;
    end if;
    commit;
    end loop;
    commit;
    DBMS_OUTPUT.PUT_LINE('Finished!');
    DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
    end;

    以下是刪除過程及時間:
    SQL> create or replace procedure delBigTab
      2  (
      3    p_TableName       in    varchar2,
      4    p_Condition       in    varchar2,
      5    p_Count        in    varchar2
      6  )
      7  as
      8   pragma autonomous_transaction;
      9   n_delete number:=0;
    10  begin
    11   while 1=1 loop
    12     EXECUTE IMMEDIATE
    13       'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'
    14     USING p_Count;
    15     if SQL%NOTFOUND then
    16        exit;
    17     else
    18              n_delete:=n_delete + SQL%ROWCOUNT;
    19     end if;
    20     commit;
    21   end loop;
    22   commit;
    23   DBMS_OUTPUT.PUT_LINE('Finished!');
    24   DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');
    25  end;
    26  /

    Procedure created.

    SQL> set timing on
    SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

    MIN(NUMDLFLOGGUID)
    ------------------
              11000000

    Elapsed: 00:00:00.23
    SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11100000','10000');

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:18.54
    SQL> select min(NUMDLFLOGGUID) from HS_DLF_DOWNLOG_HISTORY;

    MIN(NUMDLFLOGGUID)
    ------------------
              11100000

    Elapsed: 00:00:00.18
    SQL> set serveroutput on
    SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11200000','10000');
    Finished!
    Totally 96936 records deleted!

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:18.61
    10萬記錄大約19s

    SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11300000','10000');
    Finished!
    Totally 100000 records deleted!

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:18.62
    SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 11400000','10000');
    Finished!
    Totally 100000 records deleted!

    PL/SQL procedure successfully completed.

    Elapsed: 00:00:18.85
    SQL>
    SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 13000000','10000');
    Finished!
    Totally 1000000 records deleted!

    PL/SQL procedure successfully completed.

    Elapsed: 00:03:13.87

    100萬記錄大約3分鐘
    SQL> exec delBigTab('HS_DLF_DOWNLOG_HISTORY','NUMDLFLOGGUID < 20000000','10000');

    Finished!
    Totally 6999977 records deleted!

    PL/SQL procedure successfully completed.

    Elapsed: 00:27:24.69
    700萬大約27分鐘

    posted @ 2005-10-17 05:20 konhon 優華 閱讀(1763) | 評論 (0)編輯 收藏

      用戶自定義的數據庫備份 

    備份類型

    備份方法

    示例

    數據文件

    操作系統命令或工具

    C:\COPY datafile1.ora datafile.bak

    歸檔重做日志文件

    操作系統命令或工具

    C:\COPY log_01_23.arc log_01_23.bak

    控制文件

    SQL命令

    SQL>ALTER DATABASE BACKUP CONTROLFILE  TO confile.bak;

    初始化參數文件

    SQL命令

    SQL>CREATE  PFILE=SIDinit.ora FROM  SPFILE;

    網絡配置與口令文件

    操作系統命令

    C:\COPY tnsnames.ora tnsnames.bak

    數據庫邏輯對象(表、索引、存儲過程等)

    Export工具

    C:\EXPORT system/manager  TABLE

    =hr.employees file=emp.dmp



     

     

     

     

     


















    如果數據庫運行在不歸檔模式下,可以對數據庫進行不一致的完全備份,或者對某個表空間或數據文件進行單獨的備份。

    如果數據庫運行在不歸檔模式下,只能在關閉狀態下對數據庫進行一致的完全備份

    一、             表空間或數據文件的脫機備份

        如果數據庫運行在歸檔模式下,可以在打開狀態下對數據庫中處于脫機狀態的表空間或數據文件進行備份。在備份期間數據庫中其它的表空間或數據文件仍然可以被用戶使用。

    SQL>ALTER  TABLESPACE  users  OFFLINE  NORMAL;

    C:\COPY  E:\oracle\oradata\users01.dbf  F:\backup\users01.bak

    SQL>ALTER  TABLESPACE  users  ONLINE;

    SQL>ALTER  SYSTEM  ARCHIVE  LOG  CURRENT;

    二、             表空間或數據文件的聯機備份

    如果數據庫運行在歸檔模式下,可以在打開狀態下對數據庫中處于聯機狀態的表空間或數據文件進行備份。在備份期間這些表空間或數據文件仍然可以被用戶使用。

    SQL>ALTER  TABLESPACE  users  BEGIN  BACKUP;

    C:\COPY  E:\oracle\oradata\users01.dbf  F:\backup\users01.bak

    SQL>ALTER  TABLESPACE  users  END  BACKUP;

    SQL>ALTER  SYSTEM  ARCHIVE  LOG  CURRENT;

    三、             處理備份故障

    如果在備份過程中發生故障,導致備份突然中斷,那么在下一次啟動數據庫時備份表空間的數據文件將會仍然處于備份模式下,因此ORACLE會要求進行數據庫恢復。

    1、  利用ALTER  DATABASE  END  BACKUP語句退出備份模式

    SQL>STARTUP  MOUNT

    SQL>SELECT * FROM V$BACKUP WHERE STATUS=’ACTIVE’

    (查詢哪些數據文件處于備份模式)

    SQL>ALTER  DATABASE  END BACKUP;

    SQL>ALTER  DATABASE  OPEN;

    2、  利用RECOVER命令退出備份模式

       SQL>STARTUP  MOUNT

       SQL>RECOVER  DATABASE

       SQL>ALTER  DATABASE  OPEN;

    四、             控制文件備份為二進制文件

    SQL>ALTER  DATABASE  BACKUP  CONTROLFILE  TO

    ‘E:\backup\cfile.bak’  REUSE;

    五、             控制文件備份到跟蹤文件中

    SQL>ALTER  DATABASE  BACKUP  CONTROLFILE  TO  TRACE;

    (數據庫處于加載狀態時,利用上面語句可以將控制文件備份到跟蹤文件中)
    posted @ 2005-10-17 02:45 konhon 優華 閱讀(430) | 評論 (0)編輯 收藏

     

    Create  function fun_getPY
     (
        @str nvarchar(4000)
     )
    returns nvarchar(4000)
    as
    begin

      declare @word nchar(1),@PY nvarchar(4000)

      set @PY=''

      while len(@str)>0
      begin
        set @word=left(@str,1)

        --如果非漢字字符,返回原字符
        set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901
                   then ( 
                                select top 1 PY 
                                from 
                                ( 
                                 select 'A' as PY,N'驁' as word
                                 union all select 'B',N'簿'
                                 union all select 'C',N'錯'
                         union all select 'D',N'鵽'
                         union all select 'E',N'樲'
                         union all select 'F',N'鰒'
                         union all select 'G',N'腂'
                         union all select 'H',N'夻'
                         union all select 'J',N'攈'
                         union all select 'K',N'穒'
                         union all select 'L',N'鱳'
                         union all select 'M',N'旀'
                         union all select 'N',N'桛'
                         union all select 'O',N'漚'
                         union all select 'P',N'曝'
                         union all select 'Q',N'囕'
                         union all select 'R',N'鶸'
                         union all select 'S',N'蜶'
                         union all select 'T',N'籜'
                         union all select 'W',N'鶩'
                         union all select 'X',N'鑂'
                         union all select 'Y',N'韻'
                         union all select 'Z',N'咗'
                          ) T 
                       where word>=@word collate Chinese_PRC_CS_AS_KS_WS 
                       order by PY ASC
                              ) 
                          else @word 
                     end)
        set @str=right(@str,len(@str)-1)
      end

      return @PY

    end

    posted @ 2005-10-17 02:44 konhon 優華 閱讀(535) | 評論 (0)編輯 收藏

    This stored procedure can be used to insert the result set of the
    particular select statement into Excel file (c:\ImportToExcel.xls,
    by default).
    You can pass the server name, user name, user password, the select
    statement to execute, and the file name to store the results set,
    as in the example below:

    EXEC ExportToExcel @server = '.',
                       @uname = 'sa',
                       @QueryText = 'SELECT au_fname FROM pubs..authors',
                       @filename = 'c:\ImportToExcel.xls'

    /*
    Version: SQL Server 7.0/2000
    Created by: Alexander Chigrik
    - all about MS SQL
    (SQL Server Articles, FAQ, Scripts, Tips and Test Exams).

    This stored procedure can be used to insert the result set of the
    particular select statement into Excel file (c:\ImportToExcel.xls,
    by default).
    You can pass the server name, user name, user password, the select
    statement to execute, and the file name to store the results set,
    as in the example below:

    EXEC ExportToExcel @server = '.',
                       @uname = 'sa',
                       @QueryText = 'SELECT au_fname FROM pubs..authors',
                       @filename = 'c:\ImportToExcel.xls'
    */

    IF OBJECT_ID('ExportToExcel') IS NOT NULL DROP PROC ExportToExcel
    GO

    CREATE PROCEDURE ExportToExcel (
      @server sysname = null,
      @uname sysname = null,
      @pwd sysname = null,
      @QueryText varchar(200) = null,
      @filename varchar(200) = 'c:\ImportToExcel.xls'
    )
    AS
    DECLARE @SQLServer int,
            @QueryResults int,
            @CurrentResultSet int,
            @object int,
            @WorkBooks int,
            @WorkBook int,
            @Range int,
            @hr int,
            @Columns int,
            @Rows int,
            @indColumn int,
            @indRow int,
            @off_Column int,
            @off_Row int,
            @code_str varchar(100),
            @result_str varchar(255)

    IF @QueryText IS NULL 
      BEGIN
        PRINT 'Set the query string'
        RETURN
      END

    -- Sets the server to the local server
    IF @server IS NULL SELECT @server = @@servername

    -- Sets the username to the current user name
    IF @uname IS NULL SELECT @uname = SYSTEM_USER

    SET NOCOUNT ON

    EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @SQLServer OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create SQLDMO.SQLServer'
        RETURN
    END

    --  Connect to the SQL Server
    IF @pwd IS NULL
      BEGIN
        EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname
        IF @hr <> 0
           BEGIN
             PRINT 'error Connect'
             RETURN
           END
      END
    ELSE
      BEGIN
        EXEC @hr = sp_OAMethod @SQLServer, 'Connect', null, @server, @uname, @pwd
        IF @hr <> 0
          BEGIN
            PRINT 'error Connect'
            RETURN
          END
      END

    SELECT @result_str = 'ExecuteWithResults("' + @QueryText + '")'
    EXEC @hr = sp_OAMethod @SQLServer, @result_str, @QueryResults OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error with method ExecuteWithResults'
        RETURN
    END

    EXEC @hr = sp_OAMethod @QueryResults, 'CurrentResultSet', @CurrentResultSet OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error get CurrentResultSet'
        RETURN
    END

    EXEC @hr = sp_OAMethod @QueryResults, 'Columns', @Columns OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error get Columns'
        RETURN
    END

    EXEC @hr = sp_OAMethod @QueryResults, 'Rows', @Rows OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error get Rows'
        RETURN
    END

    EXEC @hr = sp_OACreate 'Excel.Application', @object OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create Excel.Application'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @object, 'WorkBooks', @WorkBooks OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create WorkBooks'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @WorkBooks, 'Add', @WorkBook OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error with method Add'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @object, 'Range("A1")', @Range OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create Range'
        RETURN
    END

    SELECT @indRow = 1
    SELECT @off_Row = 0
    SELECT @off_Column = 1

    WHILE (@indRow <= @Rows)
    BEGIN
    SELECT @indColumn = 1

    WHILE (@indColumn <= @Columns)
    BEGIN

    EXEC @hr = sp_OAMethod @QueryResults, 'GetColumnString', @result_str OUT, @indRow, @indColumn
    IF @hr <> 0
    BEGIN
        PRINT 'error get GetColumnString'
        RETURN
    END

    EXEC @hr = sp_OASetProperty @Range, 'value', @result_str
    IF @hr <> 0
    BEGIN
        PRINT 'error set value'
        RETURN
    END

    EXEC @hr = sp_OAGetProperty @Range, 'Offset', @Range OUT, @off_Row, @off_Column
    IF @hr <> 0
    BEGIN
        PRINT 'error get Offset'
        RETURN
    END

    SELECT @indColumn = @indColumn + 1

    END

    SELECT @indRow = @indRow + 1
    SELECT @code_str = 'Range("A' + LTRIM(str(@indRow)) + '")'
    EXEC @hr = sp_OAGetProperty @object, @code_str, @Range OUT
    IF @hr <> 0
    BEGIN
        PRINT 'error create Range'
        RETURN
    END

    END

    SELECT @result_str = 'exec master..xp_cmdshell ''del ' + @filename + ''', no_output'
    EXEC(@result_str)
    SELECT @result_str = 'SaveAs("' + @filename + '")'
    EXEC @hr = sp_OAMethod @WorkBook, @result_str
    IF @hr <> 0
    BEGIN
        PRINT 'error with method SaveAs'
        RETURN
    END

    EXEC @hr = sp_OAMethod @WorkBook, 'Close'
    IF @hr <> 0
    BEGIN
        PRINT 'error with method Close'
        RETURN
    END

    EXEC @hr = sp_OADestroy @object
    IF @hr <> 0
    BEGIN
        PRINT 'error destroy Excel.Application'
        RETURN
    END

    EXEC @hr = sp_OADestroy @SQLServer
    IF @hr <> 0
    BEGIN
        PRINT 'error destroy SQLDMO.SQLServer'
        RETURN
    END
    GO

    posted @ 2005-10-17 02:43 konhon 優華 閱讀(431) | 評論 (0)編輯 收藏

    數學函數 
      1.絕對值 
      S:select abs(-1) value 
      O:select abs(-1) value from dual 

      2.取整(大) 
      S:select ceiling(-1.001) value 
      O:select ceil(-1.001) value from dual 

      3.取整(小) 
      S:select floor(-1.001) value 
      O:select floor(-1.001) value from dual 

      4.取整(截取) 
      S:select cast(-1.002 as int) value 
      O:select trunc(-1.002) value from dual 

      5.四舍五入 
      S:select round(1.23456,4) value 1.23460 
      O:select round(1.23456,4) value from dual 1.2346 

      6.e為底的冪 
      S:select Exp(1) value 2.7182818284590451 
      O:select Exp(1) value from dual 2.71828182 

      7.取e為底的對數 
      S:select log(2.7182818284590451) value 1 
      O:select ln(2.7182818284590451) value from dual; 1 

      8.取10為底對數 
      S:select log10(10) value 1 
      O:select log(10,10) value from dual; 1 

      9.取平方 
      S:select SQUARE(4) value 16 
      O:select power(4,2) value from dual 16 

      10.取平方根 
      S:select SQRT(4) value 2 
      O:select SQRT(4) value from dual 2 

      11.求任意數為底的冪 
      S:select power(3,4) value 81 
      O:select power(3,4) value from dual 81 

      12.取隨機數 
      S:select rand() value 
      O:select sys.dbms_random.value(0,1) value from dual; 

      13.取符號 
      S:select sign(-8) value -1 
      O:select sign(-8) value from dual -1 

      14.圓周率 
      S:SELECT PI() value 3.1415926535897931 
      O:不知道 

      15.sin,cos,tan 參數都以弧度為單位 
      例如:select sin(PI()/2) value 得到1(SQLServer) 

      16.Asin,Acos,Atan,Atan2 返回弧度 

      17.弧度角度互換(SQLServer,Oracle不知道) 
      DEGREES:弧度-〉角度 
      RADIANS:角度-〉弧度 

    數值間比較 

      18. 求集合最大值 
      S:select max(value) value from 
      (select 1 value 
      union 
      select -2 value 
      union 
      select 4 value 
      union 
      select 3 value)a 

      O:select greatest(1,-2,4,3) value from dual 

      19. 求集合最小值 
      S:select min(value) value from 
      (select 1 value 
      union 
      select -2 value 
      union 
      select 4 value 
      union 
      select 3 value)a 

      O:select least(1,-2,4,3) value from dual 

      20.如何處理null值(F2中的null以10代替) 
      S:select F1,IsNull(F2,10) value from Tbl 
      O:select F1,nvl(F2,10) value from Tbl 

      21.求字符序號 
      S:select ascii('a') value 
      O:select ascii('a') value from dual 

      22.從序號求字符 
      S:select char(97) value 
      O:select chr(97) value from dual 

      23.連接 
      S:select '11'+'22'+'33' value 
      O:select CONCAT('11','22')  33 value from dual 

    23.子串位置 --返回3 
      S:select CHARINDEX('s','sdsq',2) value 
      O:select INSTR('sdsq','s',2) value from dual 

      23.模糊子串的位置 --返回2,參數去掉中間%則返回7 
      S:select patindex('%d%q%','sdsfasdqe') value 
      O:oracle沒發現,但是instr可以通過第四個參數控制出現次數 
      select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6 

      24.求子串 
      S:select substring('abcd',2,2) value 
      O:select substr('abcd',2,2) value from dual 

      25.子串代替 返回aijklmnef 
      S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value 
      O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual 

      26.子串全部替換 
      S:沒發現 
      O:select Translate('fasdbfasegas','fa','我' ) value from dual 

      27.長度 
      S:len,datalength 
      O:length 

      28.大小寫轉換 lower,upper 

      29.單詞首字母大寫 
      S:沒發現 
      O:select INITCAP('abcd dsaf df') value from dual 

      30.左補空格(LPAD的第一個參數為空格則同space函數) 
      S:select space(10)+'abcd' value 
      O:select LPAD('abcd',14) value from dual 

      31.右補空格(RPAD的第一個參數為空格則同space函數) 
      S:select 'abcd'+space(10) value 
      O:select RPAD('abcd',14) value from dual 

      32.刪除空格 
      S:ltrim,rtrim 
      O:ltrim,rtrim,trim 

      33. 重復字符串 
      S:select REPLICATE('abcd',2) value 
      O:沒發現 

      34.發音相似性比較(這兩個單詞返回值一樣,發音相同) 
      S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') 
      O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual 
      SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差 
      返回0-4,4為同音,1最高 

    日期函數 
      35.系統時間 
      S:select getdate() value 
      O:select sysdate value from dual 

      36.前后幾日 
      直接與整數相加減 

      37.求日期 
      S:select convert(char(10),getdate(),20) value 
      O:select trunc(sysdate) value from dual 
      select to_char(sysdate,'yyyy-mm-dd') value from dual 

      38.求時間 
      S:select convert(char(8),getdate(),108) value 
      O:select to_char(sysdate,'hh24:mm:ss') value from dual 

    39.取日期時間的其他部分 
      S:DATEPART 和 DATENAME 函數 (第一個參數決定) 
      O:to_char函數 第二個參數決定 

      參數---------------------------------下表需要補充 
      year yy, yyyy 
      quarter qq, q (季度) 
      month mm, m (m O無效) 
      dayofyear dy, y (O表星期) 
      day dd, d (d O無效) 
      week wk, ww (wk O無效) 
      weekday dw (O不清楚) 
      Hour hh,hh12,hh24 (hh12,hh24 S無效) 
      minute mi, n (n O無效) 
      second ss, s (s O無效) 
      millisecond ms (O無效) 
      ---------------------------------------------- 

      40.當月最后一天 
      S:不知道 
      O:select LAST_DAY(sysdate) value from dual 

      41.本星期的某一天(比如星期日) 
      S:不知道 
      O:SELECT Next_day(sysdate,7) vaule FROM DUAL; 

      42.字符串轉時間 
      S:可以直接轉或者select cast('2004-09-08'as datetime) value 
      O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL; 

      43.求兩日期某一部分的差(比如秒) 
      S:select datediff(ss,getdate(),getdate()+12.3) value 
      O:直接用兩個日期相減(比如d1-d2=12.3) 
      SELECT (d1-d2)*24*60*60 vaule FROM DUAL; 

      44.根據差值求新的日期(比如分鐘) 
      S:select dateadd(mi,8,getdate()) value 
      O:SELECT sysdate+8/60/24 vaule FROM DUAL; 

      45.求不同時區時間 
      S:不知道 
      O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL; 

      -----時區參數,北京在東8區應該是Ydt------- 
      AST ADT 大西洋標準時間 
      BST BDT 白令海標準時間 
      CST CDT 中部標準時間 
      EST EDT 東部標準時間 
      GMT 格林尼治標準時間 
      HST HDT 阿拉斯加?夏威夷標準時間 
      MST MDT 山區標準時間 
      NST 紐芬蘭標準時間 
      PST PDT 太平洋標準時間 
      YST YDT YUKON標準時間

    posted @ 2005-10-13 07:14 konhon 優華 閱讀(498) | 評論 (0)編輯 收藏

    function SetSystemtime(ATime: TDateTime): Boolean;
    var
      ADateTime: TSystemTime;
      yy, mon, dd, hh, min, ss, ms: Word;
    begin
      decodedate(ATime, yy, mon, dd);
      decodetime(ATime, hh, min, ss, ms);
      with ADateTime do
      begin
        wYear := yy;
        wMonth := mon;
        wDay := dd;
        wHour := hh;
        wMinute := min;
        wSecond := ss;
        wMilliseconds := ms;
      end;
      Result := SetLocalTime(ADateTime);
      SendMessage(HWND_BROADCAST, WM_TIMECHANGE, 0, 0);
    end;
    posted @ 2005-10-12 00:49 konhon 優華 閱讀(488) | 評論 (0)編輯 收藏

    oracle入門知識

    一個表空間只能屬于一個數據庫  
    每個數據庫最少有一個控制文件(建議3個,分別放在不同的磁盤上)  
    每個數據庫最少有一個表空間(SYSTEM表空間)  
    建立SYSTEM表空間的目的是盡量將目的相同的表存放在一起,以提高使用效率,只應存放數據字典  
      
    每個數據庫最少有兩個聯機日志組,每組最少一個聯機日志文件  
      
    一個數據文件只能屬于一個表空間  
    一個數據文件一旦被加入到一個表空間中,就不能再從這個表空間中移走,也不能再加入到其他表空間中  
      
    建立新的表空間需要建立新的數據文件  
      
    COMMIT后,數據不一定立即寫盤(數據文件)  
      
    一個事務即使不被提交,也會被寫入到重做日志中。  
      
    oracle server可以同時啟動多個數據庫  
      
    一套操作系統上可以安裝多個版本的ORACLE數據庫系統(UNIX可以,NT不可以)  
      
    一套ORACLE數據庫系統中可以有多個ORACLE數據庫及其相對應的實例

    posted @ 2005-10-06 03:38 konhon 優華 閱讀(509) | 評論 (0)編輯 收藏

    軟件名稱: 輕松Oracle 8開發
    軟件大小: 10970KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    輕松Oracle 8開發這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1214.html 下 載

    ========================================================
    軟件名稱: 微軟數據庫開發夢工場簡體中文版多媒體教學光盤-ORACLE
    軟件大小: 15344KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    微軟數據庫開發夢工場簡體中文版多媒體教學光盤-ORACLE這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1213.html 下 載

    ========================================================
    軟件名稱: 完全接觸 Oracle
    軟件大小: 5813KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    完全接觸 Oracle這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1212.html 下 載

    ========================================================
    軟件名稱: 即學即用Oracle
    軟件大小: 17650KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    即學即用Oracle這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1211.html 下 載

    ========================================================
    軟件名稱: OReilly.Classic.Shell.Scripting.Feb.2005
    軟件大小: 1049KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    OReilly.Classic.Shell.Scripting.Feb.2005這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1210.html 下 載

    ========================================================
    軟件名稱: Oracle錯誤碼大全
    軟件大小: 1374KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle錯誤碼大全這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1209.html 下 載

    ========================================================
    軟件名稱: oracle的入門心得
    軟件大小: 489KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle的入門心得這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1208.html 下 載

    ========================================================
    軟件名稱: oracle數據操作和控制語言詳解
    軟件大小: 10KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle數據操作和控制語言詳解這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1207.html 下 載

    ========================================================
    軟件名稱: oracle數據庫網絡的安裝和配置
    軟件大小: 1076KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle數據庫網絡的安裝和配置這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1206.html 下 載

    ========================================================
    軟件名稱: Oracle數據庫系統應用實例集錦與編程技巧
    軟件大小: 5893KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle數據庫系統應用實例集錦與編程技巧這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1205.html 下 載

    ========================================================
    軟件名稱: Oracle數據庫系統
    軟件大小: 5399KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle數據庫系統這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1204.html 下 載

    ========================================================
    軟件名稱: oracle數據庫管理員教程
    軟件大小: 191KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle數據庫管理員教程這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1203.html 下 載

    ========================================================
    軟件名稱: oracle數據庫管理
    軟件大小: 27736KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle數據庫管理這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1202.html 下 載

    ========================================================
    軟件名稱: oracle數據庫dba管理手冊
    軟件大小: 50522KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle數據庫dba管理手冊這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1201.html 下 載

    ========================================================
    軟件名稱: Oracle開發
    軟件大小: 5572KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle開發這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1200.html 下 載

    ========================================================
    軟件名稱: oracle常用傻瓜問題1000問
    軟件大小: 25KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle常用傻瓜問題1000問這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1199.html 下 載

    ========================================================
    軟件名稱: ORACLE培訓教材
    軟件大小: 95KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    ORACLE培訓教材這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1198.html 下 載

    ========================================================
    軟件名稱: oracle初學者1000問
    軟件大小: 35KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle初學者1000問這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1197.html 下 載

    ========================================================
    軟件名稱: oracle專家高級編程
    軟件大小: 30482KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle專家高級編程這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1196.html 下 載

    ========================================================
    軟件名稱: Oracle_Errors
    軟件大小: 1373KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle_Errors這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1195.html 下 載

    ========================================================
    軟件名稱: OracleUML建模
    軟件大小: 8397KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    OracleUML建模這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1194.html 下 載

    ========================================================
    軟件名稱: Oraclea Call Interface Programmer’s Guide
    軟件大小: 2340KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oraclea Call Interface Programmer’s Guide這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1193.html 下 載

    ========================================================
    軟件名稱: oracle9i數據庫系統培訓教程
    軟件大小: 24785KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle9i數據庫系統培訓教程這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1192.html 下 載

    ========================================================
    軟件名稱: Oracle9i應用服務器詳解
    軟件大小: 25592KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle9i應用服務器詳解這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1191.html 下 載

    ========================================================
    軟件名稱: Oracle9iAS Portal 寶典
    軟件大小: 30270KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle9iAS Portal 寶典這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1190.html 下 載

    ========================================================
    軟件名稱: oracle9i 數據庫設計指引全集
    軟件大小: 92KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle9i 數據庫設計指引全集這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1189.html 下 載

    ========================================================
    軟件名稱: ORACLE9i Windows安裝手冊
    軟件大小: 609KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    ORACLE9i Windows安裝手冊這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1188.html 下 載

    ========================================================
    軟件名稱: Oracle8最新教程
    軟件大小: 10217KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    Oracle8最新教程這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1187.html 下 載

    ========================================================
    軟件名稱: ORACLE8i_9i數據庫基礎
    軟件大小: 551KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    oracle8i_9i數據庫基礎這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1186.html 下 載

    ========================================================
    軟件名稱: ORACLE8 UML 對象建模設計
    軟件大小: 9728KB
    軟件語言: 簡體中文
    軟件類別: 書籍教程\數據庫類
    軟件簡介: <br>
    ORACLE8 UML 對象建模設計這本書還不錯,值得一看.<br>
    http://www.xuanxi.net/Software/Catalog138/1185.html 下 載

    最新的書籍教程 更新時間:2005-9-11 更多的下載請到http://www.xuanxi.net 軒溪軟件園

    posted @ 2005-09-29 03:05 konhon 優華 閱讀(552) | 評論 (0)編輯 收藏

    1.Powerdesigner使用建議
    1.1業務規則的使用(Business Rule)
    對于一些業務邏輯可能出現在多個數據表中,建議封裝成Business Rule,這樣便于業務邏輯的重新使用,也便于業務邏輯的維護。
    為了便于維護業務邏輯,可以考慮將Business Rule和Domains結合起來使用。將業務Business Rule應用到Domains上,然后再把Domains應用到數據表的字段上。
    例如:在拆遷項目中,拆遷業務部分,管理參數業務部分,房源業務部分,拆遷合同部分的數據表中都有樓層這個字段,因此先一個Business Rule,然后定義一個Domain,這樣相應的數據表的字段就可以使用這個Domain了。
    1.2.自定義數據類型(Domains)的使用
    oralce提供了一些內置的數據類型,但是用戶也可以根據業務的需要,定義自定義的數據類型。
    在自定義數據類型里面包裝業務邏輯。
    正如上面的房屋樓層,我們可以定義一個獨立的數據類型(Domain)維護,然后在相關數據表的
    字段上使用這個自定義數據類型。
    一般在定義自己的數據類型時候,可以在oracle基本類型上定義,然后可以加上一些standard check或者Business Rules。
    比如:在拆遷項目中,面積類別這個字段在很多數據表都出現了,可以作為一個單獨的數據類型類維護,定義一個” 面積類別” Domains(包含的種類有:0 --- 廳房面積,1 --- 使用面積,2 --- 單元面積,,3 --- 總建筑面積,4 --- 分攤面積)。而且由于Powerdesigner的提供關聯作用,這樣便于當業務邏輯發生了變動,能夠很快查詢出那些對象受到影響。
    1.3序列號(Sequence)的使用
    在powersigner的模型里面定義一堆了Sequence,接下來的是要把他們和數據表的相關字段關聯起來,特別是那些用于多個數據表字段的Sequence。
    一個數據表原則上只允許一個字段使用Sequence,并且在數據表的字段使用Sequence前,應該把該Sequence添加到數據表的Extended Dependencies中。
    如果一個數據表有2個字段或者更多字段使用了Sequence,那模型檢查時會給出提示信息。
    使用的規則一般是只能應用到數據表的主鍵字段上。
    主鍵字段建議是 數據表+“ID“或者 “編號“構成。
    例如:“房屋整合面積“ 數據表,那它的主鍵字段=房屋整合面積編號,對應的Sequence為
    SEQ_房屋整合面積。其它數據表可能也使用到了這個Sequence,那也需要在使用前設置引用關系。
    (在數據表的Extended Dependencies 上設置引用關系)
    1.4 Oracle Package的使用
    在Oracle Package里面可以定一些procedure ,但是Oracle包引用的數據庫對象到底有哪些呢,這些信息建議手動維護起來。特別是Oracle Package使用了哪些數據表,視圖,以及Oracle Packag等信息建議維護起來。
    1.5包的使用
    PowerDesigner的包相當于文件夾。用戶可以把它當作一個維護業務邏輯的容器。PowerDesigner包一般建議按照業務模塊來建立。如果模塊需要細分,可以考慮建立PowerDesigner子包來完成。
    建議容器里保存的是模型對象的快捷方式。原始信息建議不要放到容器里面。因為在要是把這些信息放到容器里,在PowerDesigner的模型合并或者逆向工程時,這種方式的信息可能得不到維護。
    PowerDesigner的包下面的PhysicalDiagram,建議采用象ERWin的Subject Area那樣,按照某個主題或者業務角度的方式來組織PhysicalDiagram包含的對象,使得每個PhysicalDiagram的功能明確。

    1.6.視圖(View)的使用
    視圖一般是數據表或者視圖上建立得來的(當然也可能引用了某個存儲過程)。一般視圖的模型中應該維護視圖的數據來源的引用信息。
    在我們現在的項目中數據庫模型沒有對視圖進行維護,為此需要在建立視圖的Powerdesigner
    模型。
    我在Powerdesigner9.5環境下通過逆向工程不能夠獲得視圖(view)的腳本,通過修改相關配
    置參數,還是不能夠獲得腳本。
    可以通過以下2方法獲得視圖(view)的腳本。
    方法1:使用powerdesigner8.0的逆向工程獲得視圖的腳本,然后在Powerdesigner9.5中把視
    圖的模型合并進來,這樣就可以對視圖進行維護了。
    方法2:使用Erwin逆向工程獲得視圖的Erwin模型,然后再把模型保存為ERX類型的文件
    在Powerdesigner9.5中導入該文件,然后進行合并模型就可以了
    PowerDesigner的視圖模型處理能力比較差,不能構維護視圖的依賴關系(也就是建立視圖對數據源的依賴關系),這一點明顯不如ERWin。

    1.7.同義詞(synonym)的使用
    同義詞相當于給數據庫對象一個別名,提供了位置和數據的獨立性。在跨數據庫用戶訪問對象時,可以考慮建立同義詞結合權限分配,簡化數據庫對象的訪問。

    1.8.數據表的使用
    數據表的注釋語句的更新。
    業務背景:
    在我們的項目中,Erwin模型中的數據表的注釋語句沒有同步到Oracle數據庫?,F在需要更數據庫中的數據表的注釋語句。
    可能可以采取的實現方法:
    方法1:Erwin直接正向工程,但是從Erwin直接正向工程由于注釋語句中有回車符號,更新會失敗。
    方法2:如果把Erwin模型轉換成為powerdesigner模型再更新數據表的注釋語句,這樣就可以避免回車符號的問題,按正常情況是可以行得通的,但是由于Erwin模型中的邏輯模型和物理模型不一致,甚至它們出現的順序不一致,這樣獲得powerdesigner模型就不正確了,生成的修改數據庫的腳本也就不正確了。
    實際采用的方法:
    把Erwin模型轉換成powerdesigner模型在Erwin中保存為ERX類型,然后在PowerDesigner導入模型),并且把文件保存為PDM類型(XML格式),刪除模型中的視圖,domains,Business Rule,reference等信息,只留下相關數據表本身的信息,然后把模型文件的后綴修改XML,并且采用XMLSPY生成這個文件的DTD文件,再采用Java編寫了一個基于SAX的程序去解析XML文件,把各個數據表以及字段的注釋語句提取出來,然后更新數據庫中數據表和字段的注釋語句,這樣就可以了。

    1.9.ERWin升級到PowerDesigner的相關問題
    1.9.1 Domain的升級
    從Erwin3.52升級到PowerDesigner9.5時,Domain信息和數據表的關聯關系會丟失,需要手動重新添加2者間的關系。當然可以通過編程修改PowerDesigner的模型文件,添加2者之間的關聯關系。一般的PowerDesigner模型文件較大,只要有個幾十張數據表肯定模型文件有1MB,建議采用SAX的方式添加信息。
    注意:添加數據表字段使用的Domain時候,需要設置數據表對Domain的引用關系(也就是Extended Dependencies)。
    1.9.2 Business Rule的升級
    從Erwin3.52升級到Powerdesigner9.5,Business Rule的表達式(腳本)需要修改的,把所有的
    Business Rule的表達式中的@column 修改成%COLUMN%
    具體實現的方式,可以直接在Powerdesigner9.5里面修改;或者把模型保存為XML格式(文件類為 .pdm),通過UltraEdit或者XMLSpy等工具來修改,一個查找替換舊搞定了。當然的注意
    只能修改<c:BusinessRules> </c:BusinessRules>里面的內容,否則會修改一些不應該修改的地方。
    同Domain一樣,從Erwin3.52升級到PowerDesigner9.5時,Business信息和數據表的關聯關系也會丟失。如果Business Rule 不是太多建議手動修改模型文件。

    1.9.3.Sequence的升級
    .Sequence的升級建議采用和Domain的方式,編程實現維護。
    1.9.4.物理圖的升級
    從Erwin3.52升級到Powerdesigner9.5,物理圖同樣能夠倒入Powerdesigner9.5中,但是Powerdesigner9.5的升級功能有些問題:在生成的物理圖中數據表的信息有些問題:物理圖中的數據表的字段顯示不完全,而且很多時候數據表字段的類型都不能顯示完全。我使用java采用sax的方式把升級后的模型文件進行解析,然后重新生成物理圖中數據表的位置信息(數據表的2個坐標:左上角坐標,右下角坐標);另外根據業務需要可以生成自己的Powerdesigner9.5包并且可以創建物理圖,把數據表添加到物理圖上。

    1.9.5.其他說明
    從Erwin3.52升級到Powerdesigner9.5,我寫了一些java程序解決了相關問題,如果哪位同行遇到相似的問題
    可以交流一下。
    2.關于powerdesigner中的數據結構的變更管理
    目前拆遷項目中數據結構的有些失控,在結合powerdesigner包的概念的基礎山上提出如下一些建議。
    2.1.數據結構按照業務模塊進行維護
    模型中所有的數據結構都在一個文件中,而且在頂層文件夾中各個業務模塊維護的是數據結構的快捷方式。
    2.2.數據結構按照其生命周期進行分類管理。
    在各個業務模塊的包下面建立如下的包:
    2.2.1臨時測試數據結構:
    是一些當前業務模塊測試時使用的數據結構,可以隨時被刪除
    2.2.2討論中數據結構:
    是數據結構處于討論中,還沒有確定下來。
    2.2.3需要更新的數據結構:
    是數據結構已經確定下來,但是還沒有更新到數據庫中。
    2.2.4正式數據結構:
    在數據庫中被業務正常使用的數據結構
    2.2.5作廢中的數據結構:
    在數據庫中以前被業務正常使用,現在已經不再使用,但是還沒有進行
    被作廢的數據表中數據的遷移,沒有完全作廢的數據結構。如果要把這些數據結構進行作廢,
    需要先進行數據遷移,以及其他相關處理。
    2.2.6已經作廢的數據結構:
    在數據庫已經不再被使用的業務數據表,相關的數據遷移已經完成,但是數據表還沒有刪除,
    相關的文檔沒有更新。

    posted @ 2005-09-28 06:51 konhon 優華 閱讀(492) | 評論 (0)編輯 收藏

    “你不必嚴格遵守這些原則,違背它們也不會被處以宗教刑罰。但你應當把這些原則看成警鈴,若違背了其中的一條,那么警鈴就會響起。”

    ----------Arthur J.Riel

    (1)所有數據都應該隱藏在所在的類的內部。

    (2)類的使用者必須依賴類的共有接口,但類不能依賴它的使用者。

    (3)盡量減少類的協議中的消息。

    (4)實現所有類都理解的最基本公有接口[例如,拷貝操作(深拷貝和淺拷貝)、相等性判斷、正確輸出內容、從ASCII描述解析等等]。

    (5)不要把實現細節(例如放置共用代碼的私有函數)放到類的公有接口中。
    如果類的兩個方法有一段公共代碼,那么就可以創建一個防止這些公共代碼的私有函數。

    (6)不要以用戶無法使用或不感興趣的東西擾亂類的公有接口。

    (7)類之間應該零耦合,或者只有導出耦合關系。也即,一個類要么同另一個類毫無關系,要么只使用另一個類的公有接口中的操作。

    (8)類應該只表示一個關鍵抽象。
    包中的所有類對于同一類性質的變化應該是共同封閉的。一個變化若對一個包影響,則將對包中的所有類產生影響,而對其他的包不造成任何影響 .

    (9)把相關的數據和行為集中放置。
    設計者應當留意那些通過get之類操作從別的對象中獲取數據的對象。這種類型的行為暗示著這條經驗原則被違反了。

    (10)把不相關的信息放在另一個類中(也即:互不溝通的行為)。
    朝著穩定的方向進行依賴.

    (11)確保你為之建模的抽象概念是類,而不只是對象扮演的角色。

    (12)在水平方向上盡可能統一地分布系統功能,也即:按照設計,頂層類應當統一地共享工作。

    (13)在你的系統中不要創建全能類/對象。對名字包含Driver、Manager、System、Susystem的類要特別多加小心。
    規劃一個接口而不是實現一個接口。

    (14)對公共接口中定義了大量訪問方法的類多加小心。大量訪問方法意味著相關數據和行為沒有集中存放。

    (15)對包含太多互不溝通的行為的類多加小心。
    這個問題的另一表現是在你的應用程序中的類的公有接口中創建了很多的get和set函數。

    (16)在由同用戶界面交互的面向對象模型構成的應用程序中,模型不應該依賴于界面,界面則應當依賴于模型。

    (17)盡可能地按照現實世界建模(我們常常為了遵守系統功能分布原則、避免全能類原則以及集中放置相關數據和行為的原則而違背這條原則) 。

    (18)從你的設計中去除不需要的類。
    一般來說,我們會把這個類降級成一個屬性。

    (19)去除系統外的類。
    系統外的類的特點是,抽象地看它們只往系統領域發送消息但并不接受系統領域內其他類發出的消息。

    (20)不要把操作變成類。質疑任何名字是動詞或者派生自動詞的類,特別是只有一個有意義行為的類??紤]一下那個有意義的行為是否應當遷移到已經存在或者尚未發現的某個類中。

    (21)我們在創建應用程序的分析模型時常常引入代理類。在設計階段,我們常會發現很多代理沒有用的,應當去除。

    (22)盡量減少類的協作者的數量。
    一個類用到的其他類的數目應當盡量少。

    (23)盡量減少類和協作者之間傳遞的消息的數量。

    (24)盡量減少類和協作者之間的協作量,也即:減少類和協作者之間傳遞的不同消息的數量。

    (25)盡量減少類的扇出,也即:減少類定義的消息數和發送的消息數的乘積。

    (26)如果類包含另一個類的對象,那么包含類應當給被包含的對象發送消息。也即:包含關系總是意味著使用關系。

    (27)類中定義的大多數方法都應當在大多數時間里使用大多數數據成員。

    (28)類包含的對象數目不應當超過開發者短期記憶的容量。這個數目常常是6。
    當類包含多于6個數據成員時,可以把邏輯相關的數據成員劃分為一組,然后用一個新的包含類去包含這一組成員。

    (29)讓系統功能在窄而深的繼承體系中垂直分布。

    (30)在實現語義約束時,最好根據類定義來實現。這常常會導致類泛濫成災,在這種情況下,約束應當在類的行為中實現,通常是在構造函數中實現,但不是必須如此。

    (31)在類的構造函數中實現語義約束時,把約束測試放在構造函數領域所允許的盡量深的包含層次中。

    (32)約束所依賴的語義信息如果經常改變,那么最好放在一個集中式的第3方對象中。

    (33)約束所依賴的語義信息如果很少改變,那么最好分布在約束所涉及的各個類中。

    (34)類必須知道它包含什么,但是不能知道誰包含它。

    (35)共享字面范圍(也就是被同一個類所包含)的對象相互之間不應當有使用關系。

    (36)繼承只應被用來為特化層次結構建模。

    (37)派生類必須知道基類,基類不應該知道關于它們的派生類的任何信息。

    (38)基類中的所有數據都應當是私有的,不要使用保護數據。
    類的設計者永遠都不應該把類的使用者不需要的東西放在公有接口中。

    (39)在理論上,繼承層次體系應當深一點,越深越好。

    (40)在實踐中,繼承層次體系的深度不應當超出一個普通人的短期記憶能力。一個廣為接受的深度值是6。

    (41)所有的抽象類都應當是基類。

    (42)所有的基類都應當是抽象類。

    (43)把數據、行為和/或接口的共性盡可能地放到繼承層次體系的高端。

    (44)如果兩個或更多個類共享公共數據(但沒有公共行為),那么應當把公共數據放在一個類中,每個共享這個數據的類都包含這個類。

    (45)如果兩個或更多個類有共同的數據和行為(就是方法),那么這些類的每一個都應當從一個表示了這些數據和方法的公共基類繼承。

    (46)如果兩個或更多個類共享公共接口(指的是消息,而不是方法),那么只有他們需要被多態地使用時,他們才應當從一個公共基類繼承。

    (47)對對象類型的顯示的分情況分析一般是錯誤的。在大多數這樣的情況下,設計者應當使用多態。

    (48)對屬性值的顯示的分情況分析常常是錯誤的。類應當解耦合成一個繼承層次結構,每個屬性值都被變換成一個派生類。

    (49)不要通過繼承關系來為類的動態語義建模。試圖用靜態語義關系來為動態語義建模會導致在運行時切換類型。

    (50)不要把類的對象變成派生類。對任何只有一個實例的派生類都要多加小心。

    (51)如果你覺得需要在運行時刻創建新的類,那么退后一步以認清你要創建的是對象?,F在,把這些對象概括成一個類。

    (52)在派生類中用空方法(也就是什么也不做的方法)來覆寫基類中的方法應當是非法的。

    (53)不要把可選包含同對繼承的需要相混淆。把可選包含建模成繼承會帶來泛濫成災的類。

    (54)在創建繼承層次時,試著創建可復用的框架,而不是可復用的組件。

    (55)如果你在設計中使用了多重繼承,先假設你犯了錯誤。如果沒犯錯誤,你需要設法證明。

    (56)只要在面向對象設計中用到了繼承,問自己兩個問題:(1)派生類是否是它繼承的那個東西的一個特殊類型?(2)基類是不是派生類的一部分?

    (57)如果你在一個面向對象設計中發現多重繼承關系,確保沒有哪個基類實際上是另一個基類的派生類。

    (58)在面向對象設計中如果你需要在包含關系和關聯關系間作出選擇,請選擇包含關系。

    (59)不要把全局數據或全局函數用于類的對象的薄記工作。應當使用類變量或類方法。

    (60)面向對象設計者不應當讓物理設計準則來破壞他們的邏輯設計。但是,在對邏輯設計作出決策的過程中我們經常用到物理設計準則。

    (61)不要繞開公共接口去修改對象的狀態。

    posted @ 2005-09-27 04:13 konhon 優華 閱讀(508) | 評論 (0)編輯 收藏

    僅列出標題
    共21頁: First 上一頁 10 11 12 13 14 15 16 17 18 下一頁 Last 
    主站蜘蛛池模板: 亚洲成电影在线观看青青| 羞羞视频网站免费入口| 暖暖在线日本免费中文| 狼色精品人妻在线视频免费| 亚洲日韩小电影在线观看| 最近免费中文字幕大全高清大全1| 亚洲中文字幕无码爆乳app| 国产亚洲成人久久| 国产99视频精品免费观看7| 一级黄色片免费观看| 亚洲成人一级电影| 亚洲第一黄色网址| 8090在线观看免费观看| 亚洲AV永久无码精品网站在线观看| 亚洲乱码精品久久久久..| 免费A级毛片无码免费视| 国产一级在线免费观看| 亚洲高清毛片一区二区| 亚洲AV无码乱码在线观看裸奔| 日本一区二区三区日本免费| 久久精品免费一区二区三区| 亚洲av无码成人精品国产 | 日本一道综合久久aⅴ免费| 女人隐私秘视频黄www免费| 亚洲色无码专区一区| 亚洲国产综合91精品麻豆| 亚洲男人的天堂一区二区| 无人在线观看免费高清视频| 精品免费视在线观看| 精品免费AV一区二区三区| 亚洲成a人片毛片在线| 亚洲大尺度无码无码专区| mm1313亚洲精品无码又大又粗| 桃子视频在线观看高清免费完整| 一级做a爰片久久毛片免费看| 亚洲依依成人亚洲社区| 亚洲国产精品张柏芝在线观看 | 亚洲码一区二区三区| 国产专区一va亚洲v天堂| 黄网址在线永久免费观看| 久久久久久久久免费看无码|