2016-09-08 5 views
2

매우 자주 비즈니스 오브젝트 내에 있어야 로직과 같은 모든 곳에서 반복되는 코드로 실행! (캡슐화?) :안티 패턴의 이름은 무엇입니까 string.IsnullOrEmpty (Employee.Name),

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

그것은이 같은 곳에 있어야 같이

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

Employee.IsNameSpecified 지정되는 값의 논리를 갖는다.

이것은 단지 하나의 예이며 많은 다른 것들은 OOP의 반대이다. 비즈니스 객체에 대한 논리적 결정을 내리는 데 사용되는 절차 코드.

Logic을 BusinessObject에 캡슐화하면 정상적인 OOP 연습 (또는 다른 이름을 가진 doeas) 일 수 있습니다. 반대라는 것은 무엇입니까? 탈 폐쇄?

+1

나는 그 이름에 대해 들어 본 적이 없다. 나는 단지 그것이 "캡슐화를 위반한다"거나 "우려의 분리를 위반한다"고 말한다. – 4castle

+1

그냥 "스파게티 코드"또는 "copypasta"라고 부를 수 있습니다. – 4castle

+0

@ 4castle : copypasta는 새로운 기능입니다! 전에는 들어 본 적이 없어요, 고마워요! – Arjang

답변

2

TDA의 한 가지 맛으로 볼 수 있습니다 (묻지 않음).

여기서하고있는 일 : 클라이언트 코드는 다른 클래스가 소유 한 "속성"을 검색 한 다음 해당 값을 기반으로 결정합니다.

TDA는 귀하의 질문과 정확히 일치하는 것을 의미합니다 : 기타 등급은 귀하를 위해 결정을 내려야합니다. 귀하의 클라이언트 코드는 그 결정을 내리는 규칙을 알지 못합니다.

그러나 "재귀"는 여기에 유의하십시오. 제안 된 "해결책"은 여전히 ​​TDA를 위반합니다. 이고 다른 클래스의 값을 가져 오는이므로 클라이언트 코드에서 결정할 수 있습니다.

유일한 차이점은 첫 번째 경우 문자열을 가져오고 클라이언트는 해당 문자열이 null/empty인지 확인합니다. 두 번째 경우에는 수행 할 작업을 알려주는 부울을 가져옵니다.

그래서, "이상적인"OO 솔루션은 같이 더 많은 것 :

employee.display(); 

과 직원은 그 자체로 완전히 올바른 일을하고. 하지만이 구현은 예를 들어 SRP 위반으로 빠르게 바뀔 수 있습니다. 직원 클래스가 실제로 "표시"한다는 사실을 알고 있어야합니다.

+0

이 해당 비즈니스 오브젝트의 ViewModel에 표시되어야합니까? valod 표시 값으로 간주되는 것의 규칙은 중앙화 될 수 있습니다. – Arjang

+1

실제 컨텍스트에 따라 달라집니다. 비즈니스 오브젝트에 View 모델이있는 경우 아마도 그렇습니다. 나는 추가적인 질문이 당신의 전반적인 디자인과 모델에 달려 있다고 생각한다. – GhostCat

1

귀하의 예는 안티 패턴이없는 (그리고 MVC 패턴을 위반) :

  1. 귀하의 직원 클래스는 모델의 일부입니다.
  2. if가 View 클래스에 있어야합니다. 그리고 Model 클래스의 요소를 표시하는 View 클래스의 역할입니다.
  3. IsNameSpecified 메소드를 사용하여 Employee의 이름을 표시해야하는지 여부를 결정합니다.

1 + 2 + 3 : 귀하의 방법은 귀하의보기 클래스에서 구현되어야합니다. 모델에 포함되지 않음.

로직 (그리고 다른 개발자가 작성한 string.IsNullOrEmpty)에 따라이 메소드는 이제 View 클래스에 있습니다. IsNameSpecific (Employee e). 그리고 그 구현은 오직 하나의 명령만을 포함 할 것입니다.사람들은 분명히 이런 종류의 방법을 쓰지 않을 것입니다.

@GhostCat : employee.display(); 분명히 실수입니다 ...이 응용 프로그램의 특정 고객의 경우 직원이 숫자 일 경우를 상상해보십시오. 다른 고객의 경우 이름 및 역할 ... 등등 ...

모델의 역할은 정보를 구조화하는 것입니다. 자체를 표시하지 않습니다.

+0

나는 정말로 "당신의 모델의 역할은 단지 정보를 구조화하는 것입니다. 매우 통찰력있는"자체를 보여주지는 않습니다. 고맙습니다. – Arjang