Programing

C에 대한 설계 원리, 모범 사례 및 설계 패턴(또는 일반적으로 절차 프로그래밍)?

c10106 2022. 4. 28. 19:59
반응형

C에 대한 설계 원리, 모범 사례 및 설계 패턴(또는 일반적으로 절차 프로그래밍)?

C 프로젝트를 설계할 때 따를 수 있는 알려진 설계 원리, 모범 사례 및 설계 패턴이 있는가?또는 절차적(불복적) 프로그래밍을 위한 유용한 설계 원칙?

(나는 '객체 지향 세대'의 아이로, 처음으로 대규모 C 프로젝트를 설계해야 한다)

정보 숨기기 - Parnas(소프트웨어 기본 원리)가 지지하는 바와 같이.

머리글 및 가시성 주의 관리:

  • 외부 세계로부터 숨길 수 있는 소스 파일의 모든 것은 문서화된 외부 인터페이스만 노출되어야 한다.
  • 노출된 모든 것은 헤더로 선언된다.
  • 이 헤더는 기능이 필요한 곳(및 기능이 정의된 곳)에 사용된다.
  • 헤더는 자급자족하며 필요할 때 사용하고, 헤더가 작동하도록 하는 데 필요한 모든 것을 포함시켜 작동하도록 하기 때문에 '다른 헤더도 포함시켜야 하는 것'에 대해 걱정할 필요가 없다.
  • 헤더는 자체 보호되므로 여러 번 포함해도 상관없다.

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • '객체'(일반적으로 구조)에서 작업할 수 있는 기능 집합 설계 - 이를 사용하는 코드에서 구조의 내장을 샅샅이 뒤지는 대신 그러한 기능을 사용한다.스스로 정한 캡슐화라고 생각해라.

나의 세가지 조언:

  • 쓰기 단위 테스트를 수행하십시오.그들은 당신이 진행하면서 당신의 문제에 맞는 디자인을 할 수 있도록 도와줄 것이다.미리 계획한 생각에 의존하는 것보다 훨씬 낫다.
  • 메모리 누수 감지기를 설치하여 첫날부터 실행하십시오.프로그램/시험이 종료되는 즉시 이 라이브러리에 모든 누출을 인쇄하도록 하십시오.이것은 당신이 그것을 소개하자마자 누수를 잡을 수 있게 해줄 것이고, 그로 인해 그것의 고치는 훨씬 덜 고통스러울 것이다.
  • C에 OOP 코드를 쓰십시오.그렇게 어렵지 않다.메서드 재정의를 에뮬레이트하는 것은 가능하지만, 나는 당신이 간단한 오브젝트의 에뮬레이션으로 시작할 것을 제안한다.이 간단한 기계 장치조차도 당신에게 훌륭한 주행 거리를 줄 수 있다.

예를 들면 다음과 같다.

typedef struct Vector {
  int size;
  int limit;
  int* ints; 
} Vector;

Vector* Vector_new() {
  Vector* res = (Vector*) malloc(sizeof(Vector));
  res->limit = 10;
  res->size = 0;
  res->ints = (int*) malloc(sizeof(int) * res.limit);

  return res;
}


void Vector_destroy(Vector* v) {
  free(v->ints);
  free(v);
}

void Vector_add(Vector* v, int n) {
  if(v->size == v->limit) {
    v->limit = v->limit * 2 + 10;
    v->ints = realloc(v->ints, v->limit);     
  }

  v->ints[v->size] = n;
  ++v->size;
}

int Vector_get(Vector* v, int index) {
  if(index >= 0 && index < v->size)
    return v->ints[index];

  assert false;
}

OOP는 기술이 아닌 방법론이다.그래서 제 첫 번째 조언은 그것을 절차적 프로그래밍으로 생각하지 말라는 겁니다.

e.James의 요점에 따르면, 당신은 객체 지향 언어를 다시 만들려고 시도하거나 그 능력을 가지고 있는 척 하는 것을 원하지 않는다.몇 가지 간단한 원칙에 집착하면 여전히 모든 옳은 일을 할 수 있다.

  1. 모든 것을 테스트해 보십시오.
  2. 무엇이 다른지 찾아 캡슐화한다.
  3. 인터페이스에 대한 설계.

C에서 객체지향 코드를 쓰는 주제를 다룬 'ANSI-C와 함께 객체지향 프로그래밍'이라는 제목의 좋고 무료 온라인 책이 있다."객체 지향 C"를 검색하는 구글 검색은 또한 많은 다른 좋은 예와 자원을 산출한다.

당신의 프로젝트가 안전에 중요한 것이라면, MISRA-C는 좋은 규칙이다.주로 임베디드 c를 대상으로 하지만 다른 분야에서도 유용할 수 있다.

나는 나를 OO코더라고 생각하고 임베디드-C로 많은 일을 한다.특히 대형 프로젝트에 대해 내가 해줄 수 있는 최선의 조언은 무리하지 말라는 것이다.ANSI C 위에 완전한 OO 프레임워크를 만드는 것은 매우 유혹적일 수 있지만, 올바르게 하기 위해서는 많은 시간과 노력이 필요하다.더 많은 시간을 가질수록, 당신은 실제 프로젝트에서 일하는 대신 당신의 프레임워크를 디버깅하는 데 더 많은 시간을 할애할 것이다.명석한 두뇌로, 그리고 YAGNI를 훌륭하고 확실하게 파악하여 그 과제에 접근하라. 행운을 빈다!

참조URL: https://stackoverflow.com/questions/2492446/design-principles-best-practices-and-design-patterns-for-c-or-procedural-progr

반응형