設計並非完全隨心所欲,而是由許多的因素在進行限制,表面上看似乎有無數種方案,但權衡各種方案的利弊之後,就只能選擇其中很少的幾條加入進專案。
起初惹起困惑的,是資料庫操作的很多方法,都不是static的,而是預設的動態屬性,受以往的影響,對這點有點疑惑。設計為靜態,主要是基於節省資源考慮,靜態方法和變數儲存在程式的靜態儲存區,和全域性儲存區是在乙個位置。靜態變數並非屬於任何乙個物件,而是屬於類本身,任何乙個物件對靜態變數的修改,都會在此靜態儲存區儲存下去,也就是說,不論有多少個物件,他們在執行的時候,進行修改的,是同一片記憶體。將類的變數和方法設定為靜態的,將只開闢一片記憶體,這塊記憶體可以理解為所有的物件公用。如果只是一般的工具類,每乙個物件不儲存屬於自己的值,不進行寫操作,那麼設定為靜態的可以節省大量的空間。因為每個物件開闢屬於自己的空間後,既然其中儲存的內容都是一樣的,那麼將這塊記憶體儲存為類本身所有並無不妥,畢竟這些物件不會因為自己的值和寫操作引發混亂。但是如果每個物件都需要儲存屬於自己的資料,而且每個物件之間對該資料的更改不能影響別的物件,那麼就並不能將他們設為靜態的,而應當每個物件單獨的進行操作。
另外,思考這樣的問題,如果資料庫的操作類真的都設為靜態方法,設想這樣的情景,物件a要進行一項耗時10s的操作,在此期間,該靜態儲存區一直進行讀寫交替操作,物件b在此時請求乙個耗時3s的緊急事務處理,那如果保證物件a不會因此受到影響?在這種情況加入互斥和死鎖絕對是一種糟糕的決定,因為一旦此記憶體被加鎖,那麼在進行大併發量訪問的時候,就會因為嚴重問題,單一時刻僅能由乙個程序進行處理,會引發並行不可進行因素。
此外,在靜態方法中,不能使用$this關鍵字,因為靜態方法不能區分物件來執行。在靜態方法中,只能使用靜態變數,用self::來進行使用,就是因為這些變數儲存的位置不屬於任何的物件,導致這些資料無法被每個物件單獨操作而不對其他物件進行干擾。
如果是多執行緒多程序的時候,每個使用者需要儲存自己的資料和連線,那就無法像一些工具一樣進行靜態處理。
在進行物件導向的設計時,必須嚴格遵循物件導向的五大設計原則,這些都不是空泛的理論,而是在設計中必須踐行的規約。在閱讀資料庫操作類時,發現該類職責上並不清晰。
此資料庫操作的設計,整體上來說還是很有條理的。
dbmysql類專門進行資料庫的操作,例如:鏈結資料庫,選擇資料庫,進行事務處理,日誌記錄,進行主從協調和負載均衡,以及執行sql語句。
dbresult類專門處理sql查詢後的結果集,將結果集分成不同的型別返回,並實現迭代器的介面,以便將結果集進行遍歷。
這種處理很符合單一職責原則,而且在呼叫的時候也很清晰,但是在dbmysql類中,存在三個方法,理應屬於對結果集的處理,這三個方法是對dbmysql類的汙染,致使dbmysql類的職責出現混淆。
出現這種情況的原因,極有可能是設計者為了貪圖方便,直接在對資料庫的處理類上載入了對結果集的處理,致使汙染了以往的設計規範。
我需要深入研究物件導向的設計思想,以及關於資料庫合理的設計模式,來杜絕這種情況的發生。
一些資料庫的操作
建立乙個資料庫 create database database name 刪除乙個資料庫 drop database database name 顯示資料庫 show databases 進入某個資料庫 use database name 建立乙個資料表 create table database...
資料庫 資料庫sql一些操作
空關係 none 方法返回可以在鏈式呼叫中使用的 不包含任何記錄的空關係。在這個空關係上應用後續條件鏈,會繼續生成空關係。對於可能返回零結果 但又需要在鏈式呼叫中使用的方法或作用域,可以使用 none 方法來提供返回值。article.none 返回乙個空 relation 物件,而且不執行查詢 下...
Oracle資料庫的一些操作
如何備份oracle資料庫 md f db bak date 0,10 exp userid bszlhr bszlhr orcl 14 file f db bak date 0,10 bszlhr date 0,10 dmp log f db bak date 0,10 log bszlhr da...