문제

어떤 요소가 더 적절한 접근 방식을 결정합니까?

도움이 되었습니까?

해결책

나는 둘 다 자신의 자리가 있다고 생각합니다.

단순히 사용해서는 안됩니다 DoSomethingToThing(Thing n) 단지 "함수형 프로그래밍이 좋다"고 생각하기 때문입니다.마찬가지로 단순히 사용해서는 안됩니다 Thing.DoSomething() 왜냐하면 "객체 지향 프로그래밍이 좋기 때문입니다".

전달하고자 하는 바가 무엇인지에 달려 있다고 생각합니다.코드를 일련의 지침으로 생각하지 말고 이야기의 단락이나 문장처럼 생각하십시오.현재 작업의 관점에서 어떤 부분이 가장 중요한지 생각해 보세요.

예를 들어 '문장' 중 강조하고 싶은 부분이 목적어라면 OO 스타일을 사용해야 합니다.

예:

fileHandle.close();

파일 핸들을 전달할 때 대부분의 경우 가장 중요한 것은 핸들이 나타내는 파일을 추적하는 것입니다.

반대예:

string x = "Hello World";
submitHttpRequest( x );

이 경우 HTTP 요청을 제출하는 것이 본문인 문자열보다 훨씬 더 중요하므로 submitHttpRequst(x) 바람직하다 x.submitViaHttp()

말할 필요도 없이, 이것들은 상호 배타적이지 않습니다.당신은 아마 실제로 그럴 것입니다.

networkConnection.submitHttpRequest(x)

두 가지를 모두 혼합합니다.중요한 것은 어떤 부분을 강조하는지, 미래의 코드 독자에게 어떤 내용을 전달할 것인지 생각하는 것입니다.

다른 팁

객체 지향적이 되려면 묻지 말고 말하세요. http://www.pragmaticprogrammer.com/articles/tell-dont-ask.

따라서 DoSomethingToThing(Thing n)이 아닌 Thing.DoSomething()이 사용됩니다.

사물의 내부 상태를 처리하는 경우 Thing.DoSomething()이 더 적합합니다. 왜냐하면 사물의 내부 표현이나 작동 방식을 변경하더라도 사물과 통신하는 코드는 변경될 필요가 없기 때문입니다.사물 컬렉션을 다루거나 일부 유틸리티 메서드를 작성하는 경우 절차적 스타일의 DoSomethingToThing()이 더 합리적이거나 더 간단할 수 있습니다.하지만 여전히 일반적으로 해당 컬렉션을 나타내는 객체의 메서드로 표현될 수 있습니다.예를 들어

GetTotalPriceofThings();

Cart.getTotal();

실제로 코드가 객체 지향적인지에 따라 다릅니다.

  1. Thing.DoSomething Thing이 문장의 주제인 경우 적절합니다.
    • DoSomethingToThing(사물 n) Thing이 문장의 목적어인 경우에 적합합니다.
    • ThingA.DoSomethingToThingB(ThingB m) 내가 생각할 수 있는 모든 언어에서 함수는 하나의 클래스에 속하고 상호 소유되지 않기 때문에 피할 수 없는 조합입니다.그러나 이것은 주제와 목적어를 가질 수 있기 때문에 의미가 있습니다.

능동태는 수동태보다 더 간단하므로 문장에 단순히 "컴퓨터"가 아닌 주제가 있는지 확인하세요.이는 형식 1과 형식 3을 자주 사용하고 형식 2를 거의 사용하지 않음을 의미합니다.

명확성을 위해:

// Form 1:  "File handle, close."
fileHandle.close(); 

// Form 2:  "(Computer,) close the file handle."
close(fileHandle);

// Form 3:  "File handle, write the contents of another file handle."
fileHandle.writeContentsOf(anotherFileHandle);

오리온의 의견에 동의하지만 결정 과정을 다시 설명하겠습니다.

명사와 동사/목적어와 동작이 있습니다.

  • 이 유형의 많은 개체가 이 작업을 사용하는 경우 작업을 개체의 일부로 만드십시오.
  • 그렇지 않은 경우에는 작업을 별도로 그룹화하되 관련 작업과 함께 그룹화해 보세요.

나는 파일/문자열 예제를 좋아합니다."SendAsHTTPReply"와 같은 문자열 작업은 평균 문자열에서는 발생하지 않지만 특정 설정에서는 자주 발생합니다.그러나 기본적으로 항상 파일을 닫게 되므로(희망적으로) 클래스 인터페이스에 닫기 작업을 넣는 것이 완벽합니다.

이것을 생각하는 또 다른 방법은 엔터테인먼트 시스템의 일부를 구매하는 것입니다.TV 리모컨은 항상 함께 사용하기 때문에 TV와 함께 묶어서 사용하는 것이 좋습니다.그러나 특정 VCR용 전원 케이블을 TV와 함께 묶는 것은 이상할 것입니다. 왜냐하면 많은 고객들이 이것을 결코 사용하지 않을 것이기 때문입니다.핵심 아이디어는 이 개체에 이 작업이 얼마나 자주 사용됩니까??

여기에는 정보가 거의 충분하지 않습니다.귀하의 언어가 "Thing.something" 또는 이에 상응하는 구문을 지원하는지 여부에 따라 다릅니다(예:OO 언어입니다).그렇다면 그것이 OO 패러다임이기 때문에 훨씬 더 적절합니다(구성원은 자신이 작업하는 개체와 연결되어야 함).물론 절차적 스타일에서는 DoSomethingtoThing()이 유일한 선택입니다...또는 ThingDoSomething()

DoSomethingToThing(Thing n)은 기능적 접근 방식에 가깝지만 Thing.DoSomething()은 객체 지향 접근 방식에 가깝습니다.

이것이 객체 지향과 절차적 프로그래밍의 선택입니다 :)

나는 잘 문서화된 OO의 장점이 Thing.DoSomething()에 적용된다고 생각합니다.

고려해야 할 몇 가지 요소는 다음과 같습니다.

  • 수정하거나 확장할 수 있나요? Thing 수업.그렇지 않은 경우 전자를 사용하십시오.
  • 할 수 있다 Thing 인스턴스화됩니다.그렇지 않은 경우 나중에 정적 방법으로 사용하십시오.
  • 만약에 Thing 실제로 수정됩니다(예:변경되는 속성이 있음) 후자를 선호합니다.만약에 Thing 수정되지 않은 경우 후자도 마찬가지로 허용됩니다.
  • 그렇지 않으면 객체가 실제 객체에 매핑되므로 현실에 더 근거가 있는 것처럼 보이는 방법을 선택하세요.

OO 언어로 작업하지 않더라도 코드의 전반적인 가독성을 위해 다음과 같은 기능 세트를 사용하는 Thing.DoSomething()이 있습니다.

ThingDosomething () ThingDoanothertask () ThingwedoSomethingElse ()

그 다음에

AnotherThingDoSomething()

등등이 훨씬 더 좋습니다.

"Thing"에서 작동하는 모든 코드는 한 위치에 있습니다.물론 "DoSomething" 및 기타 작업의 이름은 일관되게 지정되어야 합니다. 따라서 ThingOneRead(), ThingTwoRead()...가 있습니다.지금쯤이면 요점을 알 수 있을 것입니다.12개월 후에 다시 코드 작업을 시작하면 시간을 내어 논리적으로 만드는 데 감사하게 될 것입니다.

일반적으로 "something"이 "thing"이 자연스럽게 수행 방법을 알고 있는 작업인 경우 thing.doSomething()을 사용해야 합니다.그렇지 않으면 DoSomethingToThing(thing)이 "사물"의 잠재적인 내부 정보에 액세스해야 하기 때문에 이는 좋은 OO 캡슐화입니다.

예를 들어voice.getTotal()

"무언가"가 "사물" 도메인 모델의 일부가 아닌 경우 한 가지 옵션은 도우미 메서드를 사용하는 것입니다.

예를 들어:Logger.log(송장)

개체에 대한 DoingSomething이 다른 시나리오에서 다른 결과를 생성할 가능성이 있다면 oneThing.DoSomethingToThing(anotherThing)을 제안합니다.

예를 들어, 프로그램에 두 가지 항목을 저장하는 것이 있을 수 있으므로 DatabaseObject.Save(thing) SessionObject.Save(thing)를 채택하는 것이 thing.Save() 또는 thing.SaveToDatabase 또는 thing.SaveToSession()보다 더 유리할 수 있습니다. .

공용 속성을 검색하는 경우를 제외하고는 클래스에 매개 변수를 거의 전달하지 않습니다.

Aeon의 답변에 추가하려면 사물과 수행하려는 작업에 따라 다릅니다.따라서 Thing을 작성 중이고 DoSomething이 Thing의 내부 상태를 변경하는 경우 가장 좋은 접근 방식은 Thing.DoSomething입니다.그러나 작업이 내부 상태를 변경하는 것 이상의 작업을 수행하는 경우 DoSomething(Thing)이 더 적합합니다.예를 들어:

Collection.Add(Thing)

~보다 낫다

Thing.AddSelfToCollection(Collection)

그리고 Thing을 작성하지 않았고 파생 클래스를 생성할 수 없다면 DoSomething(Thing)을 수행하는 것 외에는 선택의 여지가 없습니다.

객체 지향 프로그래밍에서도 메소드 대신 함수 호출을 사용하는 것이 유용할 수 있습니다(또는 우리가 호출하는 객체가 아닌 다른 객체의 메소드를 호출하는 경우).객체에 대해 save()를 호출하려는 간단한 데이터베이스 지속성 프레임워크를 상상해 보십시오.저장하려는 모든 클래스에 SQL 문을 포함시켜 코드를 복잡하게 만들고 SQL을 코드 전체에 분산시키고 스토리지 엔진을 PITA로 변경하는 대신 save(Class1), save(Class2)를 정의하는 인터페이스를 생성할 수 있습니다. ) 등.그리고 그 구현.그런 다음 실제로 DatabaseSaver.save(class1)를 호출하고 모든 것을 한 곳에 보관하게 됩니다.

나는 동의해야한다 케빈 코너

또한 두 가지 형식 중 하나를 호출하는 사람을 염두에 두십시오.호출자는 아마도 귀하의 작업에 확실히 어떤 작업을 수행하는 다른 개체의 메서드일 것입니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top