Development Tip

모범 사례 : 클래스 정의 내에서 공용 / 보호 / 개인 순서 지정?

yourdevel 2020. 10. 13. 19:28
반응형

모범 사례 : 클래스 정의 내에서 공용 / 보호 / 개인 순서 지정?


나는 처음부터 새로운 프로젝트를 시작하고 있으며 그것이 깨끗하고 좋은 코딩 표준을 갖기를 원합니다. 여기에 노련한 개발자들은 어떤 순서로 수업 내에서 물건을 배치하는 것을 좋아합니까?

A : 1) 공용 메서드 2) 전용 메서드 3) 공용 변수 4) 전용 변수

B : 1) 공용 변수 2) 전용 변수 3) 공용 메서드 4) 전용 메서드

C : 1) 공용 변수 2) 공용 메서드 3) 전용 메서드 4) 전용 변수

일반적으로 공개 정적 변수를 맨 위에 배치하고 싶지만 공개 정적 메서드가 생성자 앞에 나열됩니까, 아니면 생성자가 항상 먼저 나열되어야합니까? 그런거 ...

나는 그것이 까다 롭다는 것을 알고 있지만 궁금해했습니다. 이에 대한 모범 사례는 무엇입니까?

추신 : 아니요 저는 Cc #을 사용하지 않습니다. 알아. 나는 luddite입니다.


에서 클린 코드 로버트 C. 마틴 (다음, 첫 번째 상수 개인 회원) 클래스의 상단에 항상 넣어 멤버 변수에 코더 조언 및 방법은 원인을하지 않는 이야기처럼 읽을 수 있도록 같은 방식으로 주문해야 독자는 코드를 너무 많이 넘겨야합니다. 이는 액세스 수정 자보다 코드를 구성하는 더 현명한 방법입니다.


가장 좋은 방법은 일관성을 유지하는 것 입니다.

개인적으로 저는 public방법을 먼저 두는 것을 선호하고 , 그 다음에는 protected방법을 선호 private합니다. 회원 데이터 는 일반적으로 그렇게하지 않을 타당한 이유가없는 한 항상 비공개이거나 보호되어야합니다.

public메서드를 맨 위에 두는 이유는 클래스에 대한 인터페이스정의 하므로 헤더 파일을 읽는 사람은 누구나이 정보를 즉시 볼 수 있어야한다는 것입니다.

일반적으로, private그리고 protected회원들은 클래스의 내부를 수정 고려하지 않는, 헤더 파일을보고 대부분의 사람들에게 덜 중요하다. 이러한 정보를 " 간단 하게"유지하면 캡슐화의 더 중요한 측면 중 하나 인 알 필요가 있을 때만이 정보가 유지됩니다 .


나는 이것에 대해 다른 철학을 가지고 있다고 생각합니다. 관련 항목을 함께 그룹화하는 것을 선호합니다. 수업에서 일하기 위해 뛰어 다니는 것을 참을 수 없습니다. 코드가 흐르고 접근성 (공개, 개인, 보호 등)을 기반으로하는 다소 인공적인 순서를 사용하거나 인스턴스 대 정적 또는 멤버 대 속성 대 함수를 사용하는 것은 좋은 흐름을 유지하는 데 도움이되지 않습니다. 나는 공개 방법 본당 경우에 따라서 Method개인 도우미 메서드에 의해 구현되는 HelperMethodA, HelperMethodB등을 다음보다는 멀리 떨어져 파일의 서로 이러한 방법을 가지고, 나는 서로 가까이를 유지합니다. 마찬가지로 정적 메서드로 구현 된 인스턴스 메서드가있는 경우 이러한 메서드도 함께 그룹화합니다.

그래서 내 수업은 종종 다음과 같이 보입니다.

class MyClass {
    public string Method(int a) {
        return HelperMethodA(a) + HelperMethodB(this.SomeStringMember);
    }

    string HelperMethodA(int a) { // returns some string }

    string HelperMethodB(string s) { // returns some string }

    public bool Equals(MyClass other) { return MyClass.Equals(this, other); }

    public static bool Equals(MyClass left, MyClass right) { // return some bool }

    public double SomeCalculation(double x, double y) {
        if(x < 0) throw new ArgumentOutOfRangeException("x");
        return DoSomeCalculation(x, y); 
    }

    const double aConstant;
    const double anotherConstant;
    double DoSomeCalculation(double x, double y) {
        return Math.Pow(aConstant, x) * Math.Sin(y) 
            + this.SomeDoubleMember * anotherConstant;
    }       
}

개인적으로 나는 공개, 보호 및 비공개를 좋아합니다. 그 이유는 누군가가 헤더를 열면 먼저 액세스 할 수있는 항목을 확인한 다음 아래로 스크롤 할 때 더 자세한 정보를 볼 수 있기 때문입니다.


이것은 내 주문입니다

  1. 정적 변수
  2. 정적 방법
  3. 공용 변수
  4. 보호 된 변수
  5. 개인 변수
  6. 생성자
  7. 공개 방법
  8. 보호 된 방법
  9. 개인 방법

다음 규칙을 사용합니다.

  • 무엇보다 정적
  • 메서드 전에 생성자 앞의 변수 (생성자가 메서드 범주에 있다고 생각합니다)
  • 비공개 전에 보호하기 전에 공개

아이디어는 동작 (메소드) 전에 객체 (데이터)를 정의하는 것입니다. 정적은 실제로 개체의 일부도 아니고 동작도 아니기 때문에 분리해야합니다.


나는 많이 신경 쓰곤했다. 최근 몇 년 동안 최신 IDE를 사용하는 동안 거의 모든 것이 한두 번의 키 입력 만 있으면됩니다. 저는 제 표준을 상당히 완화했습니다. 이제 정적, 멤버 변수, 생성자부터 시작하여 그다지 걱정하지 않습니다.

C #에서는 Resharper가 자동으로 항목을 구성하도록합니다.


나는 일반적으로 정적 데이터, 회원 데이터, 회원 기능 명령뿐만 아니라 공개, 보호, 개인 주문에 동의합니다.

나는 때때로 회원 (getters & setter)처럼 그룹화하지만, 일반적으로 그룹 내에서 회원을 더 쉽게 찾을 수 있도록 알파벳순으로 나열하는 것을 선호합니다.

데이터 / 기능을 수직으로 정렬하는 것도 좋아합니다. 모든 이름이 같은 열에 정렬되도록 탭 / 공백을 충분히 오른쪽으로 이동합니다.


각자에게 그리고 Elzo가 말했듯이 최신 IDE는 드롭 다운 메뉴 등의 색상 아이콘을 사용하여 멤버와 수정자를 쉽게 찾을 수 있도록했습니다.

내 생각은 프로그래머가 클래스가 무엇을 위해 설계되었는지, 그리고 그것이 어떻게 동작 할 것으로 기대할 수 있는지 아는 것이 더 중요하다는 것입니다.

그래서 싱글 톤이라면 시맨틱 (정적 getInstance () 클래스)을 먼저 넣습니다.

구체적인 팩토리라면 getNew () 함수와 레지스터 / 초기화 함수를 먼저 넣습니다.

... 등등. 내가 처음으로 말할 때, 나는 c'tors와 d' tor 직후를 의미합니다. 왜냐하면 그것들은 모든 클래스를 인스턴스화하는 기본 방법이기 때문입니다.

다음 기능은 다음과 같습니다.

  1. 논리적 호출 순서 (예 : initialize (), preProcess (), process (), postProcess ()) 또는
  2. 관련 기능 (접근 자, 유틸리티, 조작자 등)

depending on if the class was meant primarily to be a data-store with some functions, or function provider with a few data members.


Some editors, like Eclipse and its offspring, allow you to reorder in the outline view the the vars and the methods, alphabetically or as in page.


The sequence of public followed by protected and private is more readable to me, It's better to describe the class logic in comments at top of the header file simply and function call orders to understand what a class dose and algorithms used inside.

I am using Qt c++ for a while and see some new sort of keywords like signal and slot I prefer to keep ordering like above and share my idea with you here.

#ifndef TEMPLATE_H
#define TEMPLATE_H


class ClassName
{
    Q_OBJECT
    Q_PROPERTY(qreal startValue READ startValue WRITE setStartValue)
    Q_ENUMS(MyEnum)

public:

    enum MyEnum {
        Hello = 0x0,
        World = 0x1
    };

    // constructors

    explicit ClassName(QObject *parent = Q_NULLPTR);
    ~ClassName();

    // getter and setters of member variables

    // public functions (normal & virtual) -> orderby logic

public slots:

signals:

protected:

    // protected functions it's rule followed like public functions


private slots:

private:

    // methods

    // members

};

#endif // TEMPLATE_H

참고URL : https://stackoverflow.com/questions/1760850/best-practice-ordering-of-public-protected-private-within-the-class-definition

반응형