2016-09-08 69 views
2

很多時候我碰到的是無處不在重複這樣的,應該是業務對象中的邏輯代碼(解封):什麼是反模式的名稱string.IsnullOrEmpty(Employee.Name),

if (!string.IsNullOrEmpty(Employee.Name)) Display(Employee.Name); 

因爲它應該是這樣的:

if (Employee.IsNameSpecified) Display(Employee.Name); 

Employee.IsNameSpecified具有指定值的邏輯。

這只是一個例子,許多其他人想到的是與OOP相反的過程代碼被用於作出有關業務對象的邏輯決策。

當邏輯被封裝在BusinessObject中時,它只是正常的OOP練習(或doeas具有不同的名稱?),反之稱是什麼?解封?

+1

我從來沒有聽說過它的名字。我只是說它「違反封裝」,或者說「違反了關注點分離」。 – 4castle

+1

你可以稱它爲「意大利麪代碼」或「副本」。 – 4castle

+0

@ 4castle:copypasta是新的!從未聽說過,謝謝! – Arjang

回答

2

你可以看到TDA(告訴,不要問)的一種風味。

你在這裏做什麼:客戶端代碼檢索另一個類擁有的「屬性」,然後根據該值做出決定。

TDA意味着你的問題是什麼約:那其他類應該作出這樣的決定你 - 你的客戶端代碼不應該知道的規則作出這樣的決定。

但請注意這裏的「遞歸」:提議的「解決方案」仍然違反TDA。你是仍然從另一個類獲取一個值,以便客戶端代碼可以做出決定。

唯一的區別是:在第一種情況下,您獲取一個字符串,並且客戶端檢查該字符串是否爲空/空;在第二種情況下,你獲取一個布爾值,告訴你該做什麼。

因此,「理想的」 OO解決方案會更喜歡:

employee.display(); 

和僱員完全在做正確的事情上了自己。但是,當然,這個實現可能會很快變成違反SRP的例子 - 如果Employee類真的知道「顯示」自己?!

+0

應顯示在該業務對象的ViewModel中?被認爲是valod顯示值的規則可以集中, – Arjang

+1

我想這確實取決於實際的上下文。如果您的業務對象具有View模型,那麼可能是。我認爲額外的問題實際上取決於您的整體設計和模型。 – GhostCat

1

你舉的例子不是一個反模式(和違反MVC模式):

  1. 你Employee類是模型的一部分。
  2. 你的if必須在View類中。這是View類顯示(一個)Model層的元素的角色。
  3. 您的方法是IsNameSpecified用於確定您的員工的名稱是否必須顯示。

1 + 2 + 3:您的方法必須在您的視圖類中實現。 不在型號中。

因此,遵循您的邏輯(以及其他開發人員編寫的字符串!string.IsNullOrEmpty),此方法現在位於View類中:IsNameSpecific(Employee e)。它的實現只包含一條指令。人們會明確選擇不寫這種方法。

@GhostCat:employee.display();顯然是錯誤 ...想象一下,對於此應用程序的特定客戶,員工只是一個數字。對於其他客戶,它是名稱和角色...等等......

您的模型的作用是僅用於結構信息。不顯示自己。

+0

我真的很喜歡「你的模特的角色是隻有結構信息,不要展示自己」非常有見地,謝謝 – Arjang

相關問題