我意識到這個問題已經有一年了。但是我覺得POJO的jist沒有被其他答案解決。
回答你的問題:「是POJO反對象取向(OO)?」。
不,是的。
簡單anwser解釋
沒有,因爲OO約爲建模概念,你需要的。一個POJO就是這樣做的。它將一些信息捆綁到一個對象中。
是的,因爲POJO違反OO中使用了一些原則。如tell don't ask
-原則。
詳細的回答解釋
POJO的只不過是數據的容器。你不告訴POJO做任何事情。它只是一些信息的表示。因此,你問它的當前狀態。這意味着你違反了tell dont ask
。
然而,這在一點上是不可避免的。就像函數式編程語言引入IO定義來指定函數不是「純」的。你將不得不您整潔的小OO泡程序要問的東西到外面去.. urhg ..外面..
包裝一下你的POJO的
這就是爲什麼我換POJO的模型中(命名取決於根據你的喜好,我稱他們爲模特)。你可以用擴展名(比如Klaus在他的回答中)或者組合(我更喜歡)來做到這一點。哪一個讓你感到癢癢。
POJO定義了一個真實/抽象的數據源(你並不總是模擬真實的東西)。
實施告知不要問
這隨後被傳遞到的DataModel這是負責操縱POJO。
它通過被「告知」來操縱POJO來做到這一點。我這樣做的原因是因爲有時POJO包含類型信息。 因此,直接操作POJO通常會導致某些類必須檢查POJO的鍵入。
經常做這樣的事情:
if(POJO.type == "something"){
this.doSmthWithPOJO();
}
現在,你可能最終得到一大堆POJO的具有不同的類型。因爲在你的POJO類型的信息意味着你必須做一些事情一點點不同
if(POJO.type == "something"){
this.doSomethingWithPOJO(POJO);
}
else if (POJO.type == "something else")
{
this.doSomethingElseWithPOJO(POJO);
}
else if(POJO.type == "something else entirely")
{
this.doSomethingElseEntirelyWithPOJO(POJO);
}
else{
this.print("This is starting to get ugly...");
}
你這樣做:在這種情況下,你可能最終得到這樣的事情。使用可調用函數的DataModel內部的POJO可以讓您做更乾淨的事情。在你的課堂之外移動負責任的操縱或類型檢查。
POJOTypeDataModel model = new POJOTypeDataModel(POJO);
然後上面的If-elseif-else語句因爲簡單得多。
model.doSomething();
正如我上面提到的,你將不得不在一個問題上詢問「POJO.type」。 我這樣做,當我第一次需要的數據源。數據源調用返回POJO。你檢查它的類型並返回一個DataModel而不是POJO。
重要的是要強調你只需要檢查一次POJO的類型!目前你正在檢索/創建POJO幷包裝它。
如果POJO沒有包裝或專門打印,您將不得不向POJO詢問更多的類型。這混亂了使用POJO的類的原始意圖。 它也擺脫了一大堆if語句。
此外,你也鼓勵使用抽象而不是特定類型。
總之
做上述可幫助您:
- 保持外部之外。由於POJO往往是一個數據源。
- 儘可能地堅持
tell don't ask
。
- 鼓勵使用抽象而不是具體類型(不能比POJO更具體)。
- 書寫清理器(你不需要在任何地方進行類型檢查)和更容易理解的代碼(人們在理解程序代碼的大塊方面非常糟糕)。
- 最終包裝可以幫助您避免更改您的代碼。正如你可能在你的代碼中檢查POJO的全部內容(參見if示例)。現在你簡單的在DataModel上調用一個函數,它知道該怎麼做。
回到簡單的答案
不能避免索要信息的POJO。但它對建模數據源非常完美。
因此,封裝它並使用抽象來調用DataModel限制了一些核心面向對象原則的違反,並且它使得整潔的代碼更加簡單。
因此,而不是數據類,你寧願使用什麼?一張地圖? – Makoto
呃,這取決於我猜的問題。但是我認爲地圖是完全可以接受的。沒有? – SoftwareDeveloper
使用對象來表示意圖並封裝信息。 – Makoto