C 프로그램을 효과적으로 구성하는 방법
먼저 C와 C++에서 상당한 경험을 쌓았다고 말씀드리겠습니다.하지만 저는 C에서 새로운 프로젝트를 시작하고 있고 객체 지향 언어(C# 및 C++)에서 너무 오랫동안 작업해왔기 때문에 절차 언어로 기능을 캡슐화하는 효과적인 방법을 생각하는 데 어려움을 겪고 있습니다.저의 첫 번째 생각은 단순히 OOO 지식에 의지하여 다음과 같이 구조화하는 것이었습니다.
struct Foo
{
int x;
char *y;
};
struct Foo *new_Foo()
{
return (struct Foo *)malloc(sizeof(struct Foo));
}
void Foo_member_function(struct Foo *foo, int z)
{
foo->x = z;
}
하지만 그것은 그저 지루하고 C의 정신에 어긋나는 것 같습니다.가난한 사람들의 OO인 것은 말할 것도 없습니다.
이 프로그램은 궁극적으로 상당한 규모가 될 것이기 때문에 좋은 디자인 조직에서 출발하는 것이 중요합니다.C에서 수년간의 발전과 함께 특정 디자인 패턴은 유지보수성을 위해 코드를 가장 잘 구성하는 방법으로 발전했다고 생각합니다.기능적 프로그래밍과 마찬가지로 절차적 프로그래밍도 깨끗하고 읽기 쉬운 패러다임을 가지고 있기를 바랍니다.
관련 기사와 책에 대한 조언도 받아들일 수 있습니다.
이것은 꽤 정상적이고 합리적인 관행입니다.그러나 구조 레이아웃을 헤더 파일에 노출시키지 않도록 하여 구조 레이아웃의 구현 방식을 유연하게 조정하고 종속성을 보다 효율적으로 관리할 수 있습니다.
자세한 내용은 불투명 포인터를 참조하십시오.
당신이 제안하는 것은 제가 그런 일을 하던 시절에 항상 C 프로그램을 썼던 방식입니다.'가난한 OO'이 아니라 합리적인 절차적 프로그래밍 실천이라고 생각합니다.
당신의 C 코드에 대한 몇 가지 사항을 관찰하겠습니다.
- 구조 정의와 함께 typedefs를 사용하여 코드 전체에 'struct' 키워드를 분산시킬 필요가 없습니다.
- 실제로 필요할 때만 깁스를 사용합니다 - malloc ()의 반환 값에 대한 깁스는 불필요합니다.
음... 우린 그냥 이름 짓기 규칙을 사용했었었는데...Ergo: str*는 어떤 일반적인 데이터 구조를 가지고 있습니까?그래서 어쩌면 그냥 C# 구문과 s/./._/g?
- foo_ constructor
- foo_destructor
- foo_some method
- foo_someMethod2 // ANSIC에서 과부하가 걸리지 않습니다.
- foo_other Method
... 유산도 없고...
- foo2_ construct또는
- foo2_파괴자
- foo2_some Method // 그리고 다형성은 없습니다.
하지만 밝은 면을 보면...포인터-투-pointer-투-pointer-투-기능-returning-a-pointer-투-pointer-int를 사용할 수 있습니다!오, 이런!
가장 좋은 조언은 자바의 교훈을 배우고 (그리고 추론 C#을 통해) 부작용이 없도록 라이브러리를 구성하는 것입니다.타입 디프가 많아지면 == 두통이 적어집니다...그리고 이 현자를 따르는 방법에 대한 당신의 운동 조언이 있다면 저에게 알려주세요 ;-)
건배, 키스.
그것은 C 프로그램을 작성하는 꽤 합리적인 방법입니다.리눅스 커널과 거의 같은 작업을 수행하는 또 다른 대형 애플리케이션이 있습니다.거기에 사용된 거의 OOO 기능은 다음과 같습니다.
- 예제와 같이 캡슐화를 위한 구조물 및 연산
- 가난한 사람의 유산의 한 형태로 기본 구조에 대한 포인터 - 구조 k 객체에 대한 참조가 많이 있을 것입니다.
- 템플릿 프로그래밍의 대체 기능으로 함수를 생성하는 매크로
C는 낮은 수준의 언어였으며 코드 기능과 모듈에 따라 데이터 구조를 구성하는 것이 매우 유용할 것입니다.
데이터 개체를 생성하고자 할 때는 어디서나 유형의 데프와 열거를 사용하는 것이 좋습니다.매크로 또는 정적 함수를 사용하여 필요에 따라 초기화, 할당 및 '파괴'할 수 있습니다.
위의 제안에 동의합니다.당신은 최선의 방법으로 그것을 하고 있습니다.만약 당신이 C에서 프로그래밍하기를 원한다면.
물론 이러한 선언과 내용을 자동으로 생성하기 위한 전처리기를 작성할 수도 있습니다.클래스 선언을 사용할 수도 있습니다.구성원이 되고 싶은 함수를 클래스 안에 넣습니다.기타.
하지만 여기 있는 것은 간단한 C++ to C 컴파일러입니다.C++에서 프로그램만 하고, 실제 C++ 컴파일러를 사용하고, 깨끗한 인터페이스를 사용하고, C++ 코드를 C 코드와 연결하는 것은 어떨까요?당신이 Cvs에서 코딩을 해야하는 이유가 무엇입니까?어차피 C++?또는 필요하다면 컴파일러에서 C 코드를 생성하고 출력된 C 코드를 다른 필요한 것과 함께 컴파일합니다.
저는 도서관이 C에 있어야 하는 프로젝트를 잠시 진행해 왔지만, 어떤 형태로든 OO기능을 갖고 싶습니다.저는 이와 비슷한 일을 조금 더 자세하게 하고 있습니다.
struct klass {
char * value;
void (*set_value) (struct klass *, const char *);
void (*destroy) (struct klass *);
};
static void
klass_method_set_value (struct klass * k, const char * value) {
if (k->value == NULL) {
}
}
static void
klass_object_desetroy (struct klass * k) {
free (k);
k = NULL;
}
static void
klass_method_destroy (struct klass * k) {
klass_object_destroy (k);
}
static struct klass *
klass_object_init (void) {
struct klass * obj = (struct klass *) malloc (sizeof (struct klass*) );
/* members */
obj->value = NULL;
/* methods */
obj->set_value = klass_method_set_value;
obj->destroy = klass_method_destroy;
return obj;
}
struct klass *
klass_new (void) {
return klass_object_init ();
}
뭔가 잘못되었으면 용서해 주세요. 조금 빨리 써 주세요.
언급URL : https://stackoverflow.com/questions/961781/how-to-structure-a-c-program-effectively
'it-source' 카테고리의 다른 글
jQuery $.ajax 또는 $.load가 responseType arrayBuffer를 허용합니까? (0) | 2023.10.08 |
---|---|
npm 스크립트에서 eslint --fix를 실행하는 방법 (0) | 2023.10.08 |
Oracle OLEDB 공급자의 성능 카운터를 추가할 수 없습니다. (0) | 2023.10.08 |
ESRI : 소스 맵을 구문 분석하지 못했습니다. (0) | 2023.10.03 |
Node.js의 ajax post에서 성공을 반환하는 방법 (0) | 2023.10.03 |