2010-12-30 3 views

답변

14

주 기능/방법은 창, 데이터베이스 및 기타 개체의 존재를 알 수 있습니다. 모델을 컨트롤러에 소개하는 등의 작업을 수행 할 수 있습니다.

하지만 모든 세부 사항을 관리하지는 않습니다. 데이터베이스 나 윈도우가 어떻게 구현되는지는 알지 못한다.

만약 그렇다면, 그것은 하나님의 물건이라고 비난받을 수 있습니다.

+3

맞습니다. 때때로 (항상 그런 것은 아니지만) 마스터 오브젝트가 필요하지만 그 오브젝트는 책임 클래스를 인스턴스화하고 책임을 위임해야합니다. 모든 일을 혼자서하려고하면 그것은 신이된다. 구성 및 위임은 하나가되지 못하도록 유지할 수있는 열쇠입니다. –

+1

이 답변에 가장 만족했습니다. 고맙습니다! –

3

필자의 경험에 따르면 "Develop as you go"프로젝트 관리 (또는 그 부족)의 제품인 코드를 다루는 경우 가장 자주 발생합니다. 프로젝트가 생각 나지 않고 계획되지 않았으며 객체 책임이 느슨하고 적절히 위임되지 않을 때. 이 시나리오에서는 명확한 조직이나 위임이없는 코드에 대한 포괄적 인 "신 개체"를 찾습니다.

신 개체에 문제가되는 서로 다른 클래스의 결합이나 연결이 아니기 때문에 신의 개체가 자식의 모든 책임이 아니라면 많은 시간을 달성 할 수 있다는 것은 사실이며 예측할 수 없습니다 (개발자가 아닌 다른 사람이) 자신이 정의한 책임이 무엇인지에 관한 정보를 제공해야합니다.

2

"다중"클래스에 대해 아는 것이 하나의 신을 만들지는 않습니다. 여러 클래스에 대해 알고 몇 가지 하위 문제로 분할 해야하는 문제를 해결하기 위해않습니다 하나 하나님을 확인하십시오.

나는 주어진 객체가 알고있는 클래스의 수에 하지, 문제가 여러 하위 문제로 분할할지 여부를 초점에해야한다고 생각 (당신이 지적했듯이, 때로는 여러 클래스에 대해 알 필요가있다) .

신들은 지나쳤습니다.

6

신 개체은 응용 프로그램 내의 모든 개체가 아니더라도 대부분의 개체에 직접 또는 간접적으로 참조를 포함하는 개체입니다. 질문에서 알 수 있듯이 응용 프로그램에서 신 객체를 사용하는 것을 피하는 것은 거의 불가능합니다. 일부 개체에는 UI, 데이터베이스, 통신, 비즈니스 논리 등 다양한 하위 시스템에 대한 참조가 있어야합니다. god 객체는 응용 프로그램 정의 일 필요는 없습니다. 많은 프레임 워크에는 "응용 프로그램 컨텍스트", "응용 프로그램 환경", "세션", "활성화 자"등과 같은 이름의 내장 된 신이 있습니다.

문제는 신이 존재하는지 익숙한. 극단적 인 예를 들어 설명해 드리겠습니다 ...

숫자를 표시 할 때 표시 할 소수점 이하 자릿수를 표준화하려는 경우를 가정 해 봅시다. 그러나 정밀도를 구성 할 수 있어야합니다.

class NumberFormatter { 
    ... 
    String format(double value) { 
     int decimalPlaces = getConfiguredPrecision(); 
     return formatDouble(value, decimalPlaces); 
    } 

    int getConfiguredPrecision() { 
     return /* what ??? */; 
    } 
} 

문제는, 어떻게 getConfiguredPrecision 그림 밖으로 무엇을 반환 않습니다한다 : 나는 누구의 책임입니다 숫자를 문자열로 변환하는 클래스를 생성?한 가지 방법으로 NumberFormatter_appContext이라는 멤버 필드에 저장하는 전역 응용 프로그램 컨텍스트에 대한 참조를 제공하는 것입니다. 그럼 우리가 쓸 수 : 이렇게함으로써

return _appContext.getPreferenceManager().getNumericPreferences().getDecimalPlaces(); 

, 우리는 단지뿐만 아니라 신 객체로 NumberFormatter을 만들었습니다! 왜? 이제 우리는 (간접적으로) _appContext 필드를 통해 응용 프로그램의 모든 객체를 참조 할 수 있습니다. 이거 나쁜거야? 예, 그렇습니다.

NumberFormatter에 대한 단위 테스트를 작성하려고합니다. 매개 변수를 설정하십시오 ... 응용 프로그램 컨텍스트가 필요합니다.! WTF, 저에게 모의 할 필요가있는 57 가지 방법이 있습니다. 오, 그저 선임 관리자 만 필요합니다 ... WTF, 나는 14 가지 방법을 조롱해야합니다! 숫자 환경 설정!?! 스크류, 클래스는 충분히 간단합니다, 나는 그것을 테스트 할 필요가 없습니다 ...

응용 프로그램 컨텍스트가 getDatabaseManager() 다른 방법이 있다고 가정 해 봅시다. 지난주에 우리는 SQL을 사용했기 때문에이 메소드는 SQL 데이터베이스 객체를 반환했습니다. 그러나 이번 주에 우리는 NoSQL 데이터베이스로 변경하기로 결정했으며 이제이 메서드는 새로운 형식을 반환합니다. 변경에 의해 NumberFormatter이 영향을 받습니까? 음, 기억이 안납니다. 예, 생성자에서 응용 프로그램 컨텍스트가 필요하다는 것을 알 수 있습니다 ... 소스를 열어서 살펴 보겠습니다. 아니요, 우리는 운이 좋았습니다. getPreferenceManager() 만 액세스 할 수 있습니다 ... 이제 응용 프로그램 컨텍스트를 매개 변수로 사용하는 다른 93 클래스를 확인해 봅시다.

환경 설정 관리자 나 숫자 환경 설정 개체가 변경된 경우와 같은 시나리오가 발생합니다. 이야기의 도덕은 물건은 오직 자신의 직업을 수행하는 데 필요한 것들과 그 물건들만을 포함해야한다는 것입니다. NumberFormatter의 경우에는 소수점 이하 자릿수 인 단일 정수를 알아야합니다. 포매터를 신 개체 자체로 바꾸지 않고도 마법 번호 (또는 기본 관리자 또는 더 나은 여전히 ​​숫자로 된 설정)를 아는 응용 프로그램 신 개체로 직접 만들 수 있습니다. 또한 숫자를 형식화해야하는 모든 구성 요소에는 god 객체 대신 포맷터가 제공 될 수 있습니다. 주변에서 모두 승리합니다. 요약하면,이 문제는 신 물체의 존재가 아니라 오히려 신물 같은 상태를 다른 물체에 우습하게 부여하는 행위입니다.

덧붙여 말하자면,이 문제를 정면으로 다루는 디자인 원칙은 Law of Demeter으로 알려져 있습니다. 또는 "식당에서 돈을 지불 할 때 서버에 돈을주지 말라."

+0

필자는이 글을 쓰지 않으려 고했지만 실패했다. "잘 설계된 소프트웨어에는 오직 하나의 신만이있다."라는 사일런 프로그래밍 원리가 도입되었습니다. – WReach

+0

답변 해 주셔서 감사합니다. 재미있는 읽기, 내가 더 연구 할게 :) 감사합니다! –

+0

속지 마십시오. 하나님의 물건을 조롱 할 수 없습니다. –

관련 문제