the wikipedia entry about God Objects을 읽을 때, 클래스가 너무 많거나 너무 많은 경우 이 신 오브젝트 인 것을 나타냅니다..여러 클래스를 관리하는 클래스가 "god 객체"입니까?
나는이 논리를 뒷받침하지만, 사실이라면 어떻게 모든 다른 클래스를 연결합니까? 창 관리, DB 연결 등을 연결하기 위해 항상 마스터 클래스를 사용하지 않습니까?
the wikipedia entry about God Objects을 읽을 때, 클래스가 너무 많거나 너무 많은 경우 이 신 오브젝트 인 것을 나타냅니다..여러 클래스를 관리하는 클래스가 "god 객체"입니까?
나는이 논리를 뒷받침하지만, 사실이라면 어떻게 모든 다른 클래스를 연결합니까? 창 관리, DB 연결 등을 연결하기 위해 항상 마스터 클래스를 사용하지 않습니까?
주 기능/방법은 창, 데이터베이스 및 기타 개체의 존재를 알 수 있습니다. 모델을 컨트롤러에 소개하는 등의 작업을 수행 할 수 있습니다.
하지만 모든 세부 사항을 관리하지는 않습니다. 데이터베이스 나 윈도우가 어떻게 구현되는지는 알지 못한다.
만약 그렇다면, 그것은 하나님의 물건이라고 비난받을 수 있습니다.
필자의 경험에 따르면 "Develop as you go"프로젝트 관리 (또는 그 부족)의 제품인 코드를 다루는 경우 가장 자주 발생합니다. 프로젝트가 생각 나지 않고 계획되지 않았으며 객체 책임이 느슨하고 적절히 위임되지 않을 때. 이 시나리오에서는 명확한 조직이나 위임이없는 코드에 대한 포괄적 인 "신 개체"를 찾습니다.
신 개체에 문제가되는 서로 다른 클래스의 결합이나 연결이 아니기 때문에 신의 개체가 자식의 모든 책임이 아니라면 많은 시간을 달성 할 수 있다는 것은 사실이며 예측할 수 없습니다 (개발자가 아닌 다른 사람이) 자신이 정의한 책임이 무엇인지에 관한 정보를 제공해야합니다.
"다중"클래스에 대해 아는 것이 하나의 신을 만들지는 않습니다. 여러 클래스에 대해 알고 몇 가지 하위 문제로 분할 해야하는 문제를 해결하기 위해않습니다 하나 하나님을 확인하십시오.
나는 주어진 객체가 알고있는 클래스의 수에 하지, 문제가 여러 하위 문제로 분할할지 여부를 초점에해야한다고 생각 (당신이 지적했듯이, 때로는 여러 클래스에 대해 알 필요가있다) .
신들은 지나쳤습니다.
신 개체은 응용 프로그램 내의 모든 개체가 아니더라도 대부분의 개체에 직접 또는 간접적으로 참조를 포함하는 개체입니다. 질문에서 알 수 있듯이 응용 프로그램에서 신 객체를 사용하는 것을 피하는 것은 거의 불가능합니다. 일부 개체에는 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으로 알려져 있습니다. 또는 "식당에서 돈을 지불 할 때 서버에 돈을주지 말라."
필자는이 글을 쓰지 않으려 고했지만 실패했다. "잘 설계된 소프트웨어에는 오직 하나의 신만이있다."라는 사일런 프로그래밍 원리가 도입되었습니다. – WReach
답변 해 주셔서 감사합니다. 재미있는 읽기, 내가 더 연구 할게 :) 감사합니다! –
속지 마십시오. 하나님의 물건을 조롱 할 수 없습니다. –
맞습니다. 때때로 (항상 그런 것은 아니지만) 마스터 오브젝트가 필요하지만 그 오브젝트는 책임 클래스를 인스턴스화하고 책임을 위임해야합니다. 모든 일을 혼자서하려고하면 그것은 신이된다. 구성 및 위임은 하나가되지 못하도록 유지할 수있는 열쇠입니다. –
이 답변에 가장 만족했습니다. 고맙습니다! –