2011-10-07 5 views
4

do3() 함수가 있다고 가정 해 보겠습니다. 해당 함수가 작동하려면 do1() 및 do2() 함수가 필요합니다.공용 함수 간의 연결

그러나, DO1()와 DO2()가 다른 것들에 필요한 수 (어쩌면 DO4에 대한())

이러한 모든 기능이 공개되어 (공공이어야 함).

질문 : 코드를 어떻게 구현해야합니까?

옵션 1 : 그래서

function do3() { 
    do2() 
    do whatever is needed for do3 
} 

function do2() { 
    do1() 
    do whatever is needed for do2 
} 

function do1() { 
    do whatever is needed for do1 
} 

내가 DO3()를 호출하는 경우 커플 링이

옵션 2

function do3() { 
    do whatever is needed for do3 
} 

function do2() { 
    do whatever is needed for do2 
} 

function do2() { 
    do whatever is needed for do1 
} 

그래서 때 나타납니다하지만, 난, 모든 작업이 완료 될 것이라고 확신 do3()에 전화하고 싶습니다.

do1() 
do2() 
do3() 

커플 링이 적어 질수록 두 번째 옵션이 더 좋다고 느껴집니다.하지만 실제로 설명 할 수는 없지만 느낌과 같습니다. 나는 옵션 1과 하루 동안 do2()를 변경하면 문제가 발생할 수 있다고 생각합니다.

그러나 옵션 2를 사용하면 do3을 사용하려고 할 때마다 do1과 do2를 호출해야합니다.

다른 사람이 더 좋은 아이디어가 있다면 (옵션 3?) 좋은 것입니다.

감사

+0

나는 책을 볼 수 있다고 생각한다. ([온라인으로보기] (http://books.google.co.uk/books?id=9CL446IzhuAC&pg=PA38&lpg=PA38&dq=events+chapter+one+coupling&source=bl&ots= qmJTOuCz90 & SIG = EZKvZBjF8QmGohatC97HsmAqG0c 및 HL = EN & EI = wj6tTqe5LcTX8gON_YyiCw & SA = X & 오이 = book_result & CT = resnum = 6 VED = 0CEMQ6AEwBQ #의 V = onepage & Q 이벤트 % 20chapter는 % 20one % 20coupling & F = 거짓)) "이벤트 기반 프로그래밍 : 한계 이벤트를 복용"결과 =하지 마십시오 액면가의 제목 - 제 1 장에서는 결합 된 행동의 작은 형태에 대한 결합을 줄이거 나 바꾸는 통찰력있는 설명과 방법을 제시합니다. –

답변

0

는 "나는() 실행 기능의 DO1()와 DO2을 필요로 일을 내가 그 기능 위해서는()라는 함수 DO3이 있다고 할 수 있습니다."

후안 : 당신의 설명으로 당 do3()은 do1() 및 do2()에 종속됩니다. 종속성 그래프는 두 번째 방법 가야이 경우

- ->do2() 
do3() 
    - ->do1() 

입니다.당신의 의존성 그래프는

경우 :

do3()- ->do2() - -> do1() 

  • DO3는

  • DO2 당신이해야이 경우 DO1

에 따라 DO2에 따라 달라집니다 ~하다 첫 번째 접근법.

--> : shows the dependency. 
1

커플 링 클래스없는 기능과 관련된 개념이다. 함수가있는 동일한 클래스의 다른 함수를 호출 할 수 있어야합니다. 거기에 커플 링 문제가 없습니다.

첫 번째 옵션은 정상입니다. do3 호출 do2와 do2 호출은 do1이 모두 같은 클래스에있는 한 아무 문제가 없습니다.

어디서나 코드를 반복해야하기 때문에 자신의 옵션 2를 선택하지 마십시오.

+0

커플 링은 커플 링입니다. 클래스와 특히 관련이 있습니다. 그러나 함수를 별도의 클래스로 리팩터링하는 경우 어떻게됩니까? 그렇지 않으면 나는 너에게 동의한다. –

+0

안녕하세요. 내 나쁜, "함수"정말 개체 (PHP 개체를 더 구체적인 수) 메서드입니다. 문제는 do1() do2()와 do3()이 다른 기능을 가진 다른 패키지의 다른 클래스에있을 수 있다는 것입니다. 그래서 그들은 do2()가 do6()과 do8()에 의해 호출 될 수 있다는 것을 명심하라. –

0

짧은 대답은 발신자가 이러한 호출 사이에 어떤 작업을 수행해야하는 경우 DO3()는 항상 DO2/DO1에 대한 호출을 진행해야하며 컨텍스트가없는 경우, 다음 DO2 참에 포함되어야한다는 것입니다 do3 등. 또한 doX 호출이 API 또는 환경을 변경하기 어려운 다른 일부가 아닌 한, "경우에 따라"호출을 분리하는 것을 피하는 것이 좋습니다. 미래에 어떤 경우가 발생하여 분할이 필요합니다 (신중한 설계 원칙).

길게 대답 : 무언가의 진실을 테스트하는 한 가지 방법은 병리 적 사례를 탐색하는 것입니다. 극단적 인 두 번째 옵션을 취하는 것은 기본적으로 기능 구성을 완전히 없애고 기능을 완전히 제거하는 것입니다. 결국 일부 함수는 do1() do2() do3()을 호출하므로 이러한 함수에 "결합"됩니다.

[soap box] 정적 의존성 (커플 링)이 반드시 부통령이라는 것은 진정한 명제가 아닙니다. 정적 의존성은 유연성이 없어 보일 수 있지만, 이해하기 쉽고, 기계 검증이 가능하며, 고도로 최적화 될 수 있습니다. 아마도에 이유의 무수를 위해 분해되어 종종이 같은

person = WebRequest('/GetPerson'); 
if (person.Phone.AreaCode = '') 
    person.Phone.AreaCode = GetAreaCodeFromZip(person.Zip); 
... 

논리가 될 수 있으며, : 점을 설명하기 위해,이 가상의 코드를 고려

requestService = CreationFactory(IRequest); 
requestService.Configure(ConfigurationService.GetConfiguration(requestService)); 
requestService.SetEntityContext('Person'); 
response = requestService.Invoke(); 
entity = EntityService.ProcessEntity(response.Data); 
EntityService.RegisterEntityCorrectionService(entity, IAreaCorrectionService); 
... 
interface IAreaCorrectionService 
... 
class AreaCorrectionService : IAreaCorrectionService 
... 
ServiceFactory.Register(AreaCorrectionService... 

내 요점은이 것을 단순히 성능, 가독성, 심지어 "디커플링 (decoupling)"에 대한 선언 성의 측면에서 비용이 많이 든다. 제어 반전과 다른 프레임 워크를 고려할 때 이것은 거의 명시 적으로 고려되지 않습니다.

관련 문제