2010-01-07 24 views
1

根據我對面向對象編程的基本理解,在我的情況下,PHP想讓所有的類都相互獨立。我剛開始了面向對象的應用程序,所以現在是我進行早期改變的好時機。如何讓我的對象/類更加便攜?

這是我的情況,我打破這個規則或任何你想要調用它。

我有了一個一套方法這讓我設置變量的PHP會話的會話班,我有一個視圖方法這讓我查看已經使用set設置一個值的值方法。到目前爲止,它可能聽起來不錯,但是在我的網站的每個頁面上,我都需要訪問會話數據或會話對象。但除了每個使用會話對象的頁面之外,我還在所有需要會話值的類中使用它們。我相信這是我弄糟的地方,因爲現在所有這些其他類都依賴於會話類。

任何想法,如果這是錯誤的,如果是,有什麼方法可以避免它,但仍然可以訪問其他類中的會話數據,並仍然有我的類可移植插件到其他類中未來的應用?

回答

1

這種關係被稱爲依賴性或耦合。您通常希望減少任何應用程序中的耦合(面向對象或不)。如何做到這一點可能是程序員最重要的技能,並不能真正歸結爲一些規則。

然而,在最基本的,你應該嘗試必不可少依賴和意外之間的依賴關係來區分。前者是一個無法解決的問題,所以你不應該嘗試。例如,如果你的所有網頁都需要訪問會話,那麼你真的無法幫助他們。但是,如果他們只需要一些時間,那麼你可以嘗試考慮你的應用程序,以便解決這個問題。

另一個重要的問題是儘量減少組件之間的接口。如果xXY依賴於x的子集,那麼您不應該通過X。這往往是一個有改進空間的地方。

0

想想那些其他類需要什麼才能在你的域模型中起作用。會話數據是一個實現細節,不應該影響你設計其他類的方式。會話對象可能有100個屬性,但並不是每個類都需要這100個屬性才能工作。他們不需要知道該數據是否在會話,cookie,平面文件,數據庫或地球外的衛星上持續存在。

我在設計課程時發現的一個很好的資源是this book,特別是針對您的問題的第6章「工作類」。

0

你可以添加一個抽象水平,使其WorkingClass>StoringMapper>Session,與WorkingClass只調用StoringMapper。因此,您可以輕鬆地將存儲過程「映射」到Session(例如DatabaseSession)之外的其他任何類別,而不會對WorkingClass進行任何更改。

我已經寫了它的一些代碼在回答另一個問題:Advice on framework design

0

一般來說,使用另一個類的類是純粹的基本OO和你想要的。使用Interfaces是一種讓您的具體邏輯隔離的方法,同時讓其他類以統一的方式使用此組件。一個簡單而常用的方法是使用工廠抽象工廠而不是直接調用構造函數。您還應該看看控制反轉依賴注入(DI)範例。 Here's a rudimentary example可以幫助你解決問題(但請注意,作者在工廠和DI之間混合使用)。

一個不復雜的解決方案是從您的Session類中提取一個接口。想想一個來自會話對象的調用者需要什麼。然後在你的課堂上實現界面。你可能會想讓這個類爲Singleton(在運行時只有一個實現存在的類)。然後,創建一個實例化腳本組件的工廠。將會話實例傳遞給分解方法中的組件。