클래스 디자인 대 IDE : 비회원 비 친구 기능이 실제로 그만한 가치가 있습니까?

StackOverflow https://stackoverflow.com/questions/135634

문제

(그렇지 않으면) 훌륭한 책에서 C ++ 코딩 표준, 항목 44, 제목 "비민 비 친구 기능을 작성하는 것을 선호합니다", Sutter와 Alexandrescu는 실제로 클래스 멤버에 대한 액세스가 필요한 기능 만 해당 클래스의 구성원이 될 것을 권장합니다. 멤버 기능 만 사용하여 작성할 수있는 다른 모든 작업은 클래스의 일부가되어서는 안됩니다. 그들은 비회원과 비 친구 여야합니다. 논쟁은 다음과 같습니다.

  • 클래스 내부에 액세스 할 필요가 적기 때문에 캡슐화를 촉진합니다.
  • 일부 기능이 멤버인지 아닌지를 추측 할 필요가 없기 때문에 기능 템플릿 작성이 더 쉬워집니다.
  • 클래스를 작게 유지하여 테스트하고 유지하기가 더 쉬워집니다.

이 주장에서 가치를 보았지만 큰 단점이 있습니다. 내 IDE는이 기능을 찾는 데 도움이되지 않습니다! 어떤 종류의 대상이 있고 어떤 작업을 사용할 수 있는지보고 싶을 때마다 유도 할 수는 없습니다. "pMysteriousObject->"그리고 더 이상 회원 기능 목록을 얻습니다.

깨끗한 디자인을 유지하는 것은 결국 프로그래밍 수명을 더 쉽게 만드는 것입니다. 그러나 이것은 실제로 내 것을 훨씬 더 어렵게 만듭니다.

그래서 나는 그것이 정말로 문제의 가치가 있는지 궁금합니다. 그것에 대해 어떻게 처리합니까?

도움이 되었습니까?

해결책

나는 이것에 대해 Sutter와 Alexandrescu에 동의하지 않을 것입니다. 기능의 동작이 있다고 생각합니다 foo() 계급 영역에 속합니다 Bar그렇다면의 책임 foo() 의 일부가되어야합니다 bar().

사실 그 foo() 직접 액세스 할 필요가 없습니다 Bar의 회원 데이터는 개념적으로 일부가 아니라는 것을 의미하지는 않습니다. Bar. 또한 코드가 잘 알려져 있음을 의미 할 수 있습니다. 다른 멤버 기능을 통해 모든 동작을 수행하는 멤버 기능을 갖는 것은 드문 일이 아니며 왜 그런지 모르겠습니다.

주변 관련 기능이 있어야한다는 데 전적으로 동의합니다 ~ 아니다 클래스의 일원이되지만, 수업 책임의 핵심이라면 회원 데이터와 직접적으로 멍청한 지 여부에 관계없이 회원이되어서는 안됩니다.

이러한 특정 요점은 다음과 같습니다.

클래스 내부에 액세스 할 필요가 적기 때문에 캡슐화를 촉진합니다.

실제로 내부에 직접 액세스하는 기능이 적을수록 좋습니다. 즉, 멤버 기능을 갖는 것이 가능한 한 많은 일을한다는 것을 의미합니다. ~을 통해 다른 회원 기능은 좋은 것입니다. 수업에서 잘 알고있는 기능을 분할하면 반 클래스가 남아 있으므로 많은 외부 기능이 유용해야합니다. 잘 알고있는 기능을 수업에서 멀어지게하는 것도 잘 알고있는 기능의 글쓰기를 낙담시키는 것 같습니다.

일부 기능이 멤버인지 아닌지를 추측 할 필요가 없기 때문에 기능 템플릿 작성이 더 쉬워집니다.

나는 이것을 전혀 이해하지 못한다. 수업에서 많은 기능을 꺼내면 기능 템플릿에 더 많은 책임을 져야합니다. 그들은 그것을 가정해야합니다 훨씬 적습니다 기능은 클래스에서 가져온 대부분의 기능이 템플릿 (UGH)으로 변환 될 것이라고 가정하지 않는 한 클래스 템플릿 인수에 의해 제공됩니다.

클래스를 작게 유지하여 테스트하고 유지하기가 더 쉬워집니다.

음, 물론. 또한 테스트하고 유지 관리 할 추가 외부 기능을 많이 만듭니다. 나는 이것의 가치를 보지 못한다.

다른 팁

Scott Meyers는 Sutter와 비슷한 의견을 가지고 있습니다. 여기.

그는 또한 다음을 명확하게 설명합니다.

"Jack Reeves는 다양한 문자열과 같은 클래스와의 작업을 바탕으로 일부 기능은 비회원이 아닌 비회원이 될 수 있더라도 비회원이 될 때"느낌 "이 아니라는 것을 관찰했습니다."최고의 "인터페이스는"최고의 "인터페이스입니다. 수업은 많은 경쟁 문제의 균형을 맞추면 만 찾을 수 있으며, 그 중 캡슐화 정도는 하나 일뿐입니다. "

함수가 멤버 함수가되기 위해 "그냥 의미가있는"기능이라면 하나를 만드십시오. 마찬가지로, 그것이 실제로 메인 인터페이스의 일부가 아니라면 비회원이 되려면 "그냥 말이됩니다"라면 그렇게하십시오.

한 가지 메모는 EG 연산자 == ()의 과부하 버전을 사용하면 구문이 동일하게 유지된다는 것입니다. 따라서이 경우에는 이유가 없습니다 ~ 아니다 개인 회원에게 접근 할 필요가 없다면 (내 경험상 거의 그렇지 않은 경우), 비회원이 아닌 친근한 부유 기능을 수업과 같은 장소로 선언했습니다. 그리고 심지어 연산자를 정의 할 수 있습니다! = ()는 비회원과 연산자의 관점에서 == ()를 정의 할 수 있습니다.

나는 그들 사이, Sutter, Alexandrescu 및 Meyers 사이에서 다른 어느 누구보다 C ++의 품질을 위해 더 많은 일을했다고 말하는 것은 잘못된 것이라고 생각하지 않습니다.

그들이 묻는 단순한 질문 중 하나는 다음과 같습니다.

유틸리티 함수에 매개 변수로 두 개의 독립 클래스가있는 경우, 어떤 클래스가 멤버 함수를 "소유해야합니까?

또 다른 문제는 해당 클래스가 귀하의 통제하에있는 경우 회원 기능 만 추가 할 수 있다는 것입니다. STD :: 문자열에 작성하는 모든 도우미 기능은 클래스 정의를 다시 열 수 없으므로 비회원이어야합니다.

이 두 가지 예 모두 IDE는 불완전한 정보를 제공하며 "구식 패션 방식"을 사용해야합니다.

세계에서 가장 영향력있는 C ++ 전문가가 클래스 매개 변수를 가진 비회원 기능이 클래스 인터페이스의 일부라고 생각한다는 점을 감안할 때, 이것은 코딩 스타일보다는 IDE와 더 관련이 있습니다.

IDE는 릴리스 한두 개로 변경 될 가능성이 높으며이 기능을 추가 할 수도 있습니다. 오늘날의 코딩 스타일을 IDE에 맞게 변경하는 경우, 연장 할 수없는/인사 할 수없는 코드로 미래에 더 큰 문제가 있음을 알 수 있습니다.

It's true that external functions should not be part of the interface. In theory, your class should only contain the data and expose the interface for what it is intended and not utilitarian functions. Adding utility functions to the interface just grow the class code base and make it less maintainable. I currently maintain a class with around 50 public methods, that's just insane.

Now, in reality, I agree that this is not easy to enforce. It's often easier to just add another method to your class, even more if you are using an IDE that can really simply add a new method to an existing class.

In order to keep my classes simple and still be able to centralize external function, I often use utility class that works with my class, or even namespaces. I start by creating the class that will wrap my data and expose the simplest possible interface. I then create a new class for every task I have to do with the class.

Example: create a class Point, then add a class PointDrawer to draw it to a bitmap, PointSerializer to save it, etc.

If you give them a common prefix, then maybe your IDE will help if you type

::prefix

or

namespace::prefix

In many OOP languages non-friend non-class methods are third-class citizens that reside in an orphanage unconnected to anything. When I write a method, I like to pick good parents - a fitting class - where they have the best chances to feel welcome and help.

I would have thought the IDE was actually helping you out.

The IDE is hiding the protected functions from the list because they are not available to the public just as the designer of the class intended.

If you had been within the scope of the class and typed this-> then the protected functions would be displayed in the list.

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