C에서 복잡한 프로젝트를 어떻게 구조화하면 좋을까요?
저는 초급 수준의 C 스킬을 조금 가지고 있기 때문에 C에서 다소 복잡한 어플리케이션을 구축하기 위한 사실상의 '표준'이 있는지 알고 싶습니다.GUI 기반도 마찬가지입니다.
자바와 PHP에서는 항상 OO의 패러다임을 사용해 왔는데, C를 배우고 싶기 때문에 어플리케이션 구조가 잘못되지 않을까 걱정됩니다.절차 언어로 모듈화, 디커플링 및 건조함을 가지기 위해 어떤 가이드라인을 따라야 할지 막막합니다.
추천할 만한 읽을거리라도 있나요?C의 어플리케이션 프레임워크를 찾을 수 없었습니다.틀을 사용하지 않아도 항상 코드를 보면서 좋은 아이디어를 찾았습니다.
핵심은 모듈화입니다.설계, 구현, 컴파일 및 유지보수가 용이합니다.
- OO 앱의 클래스와 같이 앱에서 모듈을 식별합니다.
- 각 모듈에 대해 별도의 인터페이스와 구현, 다른 모듈에 필요한 것만 인터페이스에 넣습니다.C 에는 네임스페이스가 없기 때문에, 인터페이스의 모든 것을 일의로 할 필요가 있습니다(예를 들면, 프리픽스를 사용하는 경우).
- 구현 시 전역 변수를 숨기고 읽기/쓰기에 액세스 기능 사용
- 유전적인 관점에서 생각하지 말고 구성적인 관점에서 생각하세요.일반적으로 C에서는 C++를 흉내내려고 하지 마십시오.읽고 유지하기가 매우 어렵습니다.
. 앱인 에이다 앱은 어떻게 구성되어 있는지.package
및 ('스위치 인터페이스')package body
(일부러)
이건 코딩용이에요.
유지보수를 위해(한 번 코드를 작성하지만 여러 번 유지보수를 합니다) Doxygen은 저에게 좋은 선택입니다.리팩터링을 할 수 있는 강력한 회귀 테스트 스위트도 구축할 것을 제안합니다.
C에서는 OO 기술을 적용할 수 없다는 것은 일반적인 오해입니다.대부분 할 수 있습니다.그것은, 업무 전용의 구문을 가지는 언어보다 조금 다루기 힘들다는 것입니다.
견고한 시스템 설계의 기초 중 하나는 인터페이스의 배후에 있는 실장의 캡슐화입니다. FILE*
을 사용할수 있습니다(기능을 사용할 수 있는 기능이 있습니다.fopen()
,fread()
etc는 C에서 확립하는 에는 액세스 에 C 에는 아무도 않는 수 ).struct FILE
하지만 오직 마조히스트만이 그렇게 할 것이다.)
필요에 따라 함수 포인터의 테이블을 사용하여 C에서 다형 동작을 취할 수 있습니다.예, 구문은 추하지만 효과는 가상 기능과 동일합니다.
struct IAnimal {
int (*eat)(int food);
int (*sleep)(int secs);
};
/* "Subclass"/"implement" IAnimal, relying on C's guaranteed equivalence
* of memory layouts */
struct Cat {
struct IAnimal _base;
int (*meow)(void);
};
int cat_eat(int food) { ... }
int cat_sleep(int secs) { ... }
int cat_meow(void) { ... }
/* "Constructor" */
struct Cat* CreateACat(void) {
struct Cat* x = (struct Cat*) malloc(sizeof (struct Cat));
x->_base.eat = cat_eat;
x->_base.sleep = cat_sleep;
x->meow = cat_meow;
return x;
}
struct IAnimal* pa = CreateACat();
pa->eat(42); /* Calls cat_eat() */
((struct Cat*) pa)->meow(); /* "Downcast" */
다 좋은 답이에요.
"데이터 구조 최소화"만 추가합니다.C++가 "C with classes"인 경우 OOP는 모든 명사/동사를 머릿속에 넣고 클래스/방식으로 바꾸도록 장려하려고 하기 때문에 C에서는 더 쉬울 수 있습니다.그것은 매우 낭비일 수 있다.
예를 들어 특정 시점에 온도 판독치가 배열되어 있고 Windows에서 이를 선형 차트로 표시하려고 한다고 가정합니다.Windows 에는 PAINT 메시지가 있습니다.이 메시지를 수신하면 LineTo 기능을 사용하여 어레이를 루프하여 데이터를 픽셀 좌표로 변환할 수 있습니다.
도표가 점과 선으로 구성되어 있기 때문에 점 객체와 선 객체로 구성된 데이터 구조를 구축하여 DrawMyself를 사용할 수 있는 데이터 구조를 영속적으로 만듭니다.그것은 어떻게든 「효율적」이 되는 이론이나, 어쩌면 마우스를 p 위에 올려야 할 수도 있습니다.도표의 예술과 수치로 데이터를 표시하기 때문에, 그들은 그것을 다루기 위한 방법을 객체에 구축한다.물론, 그것은 더 많은 객체를 만들고 삭제하는 것과 관련이 있다.
따라서 읽기 쉽고 전체 시간의 90%를 객체 관리에 할애할 수 있는 방대한 양의 코드를 얻게 됩니다.
이 모든 것은, 「좋은 프로그래밍 프랙티스」와 「효율성」의 명목으로 행해집니다.
적어도 C에서는 간단하고 효율적인 방법이 더 분명해지고 피라미드를 건설하려는 유혹은 덜 강해질 것이다.
저는 첫 단계로 C/C++ 교과서를 읽는 것을 제안합니다.예를 들어 C Primer Plus가 좋은 참고 자료입니다.예를 보면 Java OO를 C와 같은 절차적인 언어로 매핑하는 방법과 아이디어를 얻을 수 있습니다.
캡슐화는 개발 언어에 관계없이 항상 성공적인 개발을 위한 열쇠입니다.
C에서 "개인" 메서드를 캡슐화하기 위해 사용한 방법은 프로토타입을 ".h" 파일에 포함하지 않는 것입니다.
Java 또는 C++에서 코드를 구조화하는 방법을 알고 있다면 C 코드에서도 동일한 원칙을 따를 수 있습니다.유일한 차이점은 컴파일러가 옆에 없다는 것입니다.또, 모든 것을 수동으로 신중하게 실시할 필요가 있습니다.
패키지와 클래스가 없기 때문에 모듈을 신중하게 설계해야 합니다.가장 일반적인 접근법은 모듈별로 개별 소스 폴더를 작성하는 것입니다.다른 모듈 간에 코드를 구별하려면 명명 규칙을 사용해야 합니다.예를 들어, 모든 함수에 모듈 이름을 붙입니다.
C와의 클래스는 할 수 없지만, 「데이터 타입의 추출」은 간단하게 실장할 수 있습니다..C 및 를 만듭니다.모든 추상 데이터 유형에 대한 H 파일입니다.필요에 따라 두 개의 헤더 파일(공용 및 개인 파일)을 가질 수 있습니다.이 개념은 내보내야 하는 모든 구조, 상수 및 함수가 공용 헤더 파일로 이동한다는 것입니다.
도구도 매우 중요합니다.C에게 유용한 도구는 보풀입니다.보풀은 코드 내의 악취를 찾아내는 데 도움이 됩니다.사용할 수 있는 또 다른 도구는 문서 생성에 도움이 되는 Doxygen입니다.
인기 있는 오픈 소스 C 프로젝트의 코드를 확인해 보시기 바랍니다. 예를 들면...음... Linux 커널 또는 Git; 어떻게 구성되는지 보세요.
GNU 코딩 표준은 몇 십 년 동안 발전해 왔습니다.본문 그대로 따르지 않더라도 읽어보는 게 좋을 것 같아요.그 안에서 제기된 포인트에 대해 생각하는 것으로, 독자적인 코드를 구성하는 방법에 대한 보다 확실한 기초를 얻을 수 있습니다.
복잡한 어플리케이션의 숫자 규칙: 읽기 쉬워야 합니다.
복잡한 어플리케이션을 심플하게 하기 위해 Divide and Concur를 채용하고 있습니다.
언급URL : https://stackoverflow.com/questions/661307/how-should-i-structure-complex-projects-in-c
'source' 카테고리의 다른 글
"$attrs is read only", "$listeners is read only", "프로포트를 직접 변환하지 마십시오." (0) | 2022.08.18 |
---|---|
Vuex 개체를 비울 때 Vue 프로젝트에서 정의되지 않은 오류를 방지하려면 어떻게 해야 합니까? (0) | 2022.08.18 |
C에서 Seg fault를 생성하는 가장 간단한 표준 적합 방법은 무엇입니까? (0) | 2022.08.16 |
vue 인스턴스(app1)에 대한 가장 좋은 방법은 다른 vue 인스턴스(app2)를 호출하는 것입니다. (0) | 2022.08.16 |
Java에서의 범용 삭제의 개념은 무엇입니까? (0) | 2022.08.16 |