C에서 복잡한 프로젝트를 어떻게 구성해야합니까?
저는 초급 수준의 C 기술 이상을 가지고 있으며 C로 다소 복잡한 응용 프로그램을 구성하기위한 사실상 "표준"이 있는지 알고 싶습니다. 심지어 GUI 기반 응용 프로그램도 있습니다.
저는 항상 Java와 PHP에서 OO 패러다임을 사용해 왔으며 이제 C를 배우고 싶기 때문에 응용 프로그램을 잘못된 방식으로 구성 할 수 있습니다. 절차 적 언어로 모듈화, 분리 및 건조 함을 갖기 위해 따라야 할 지침이 무엇인지 놓치고 있습니다.
제안 할 판독 값이 있습니까? C 용 애플리케이션 프레임 워크를 찾을 수 없었습니다. 프레임 워크를 사용하지 않더라도 항상 코드를 검색하여 좋은 아이디어를 찾았습니다.
핵심은 모듈화입니다. 이것은 설계, 구현, 컴파일 및 유지 관리가 더 쉽습니다.
- OO 앱의 클래스와 같이 앱의 모듈을 식별합니다.
- 각 모듈에 대한 별도의 인터페이스 및 구현, 다른 모듈에 필요한 것만 인터페이스에 넣습니다. C에는 네임 스페이스가 없으므로 인터페이스의 모든 것을 고유하게 만들어야합니다 (예 : 접두사 사용).
- 구현시 전역 변수를 숨기고 읽기 / 쓰기에 접근 자 함수를 사용합니다.
- 상속 측면에서 생각하지 말고 구성 측면에서 생각하십시오. 일반적으로 C에서 C ++를 모방하려고하지 마십시오. 이것은 읽고 유지하기가 매우 어렵습니다.
학습 할 시간이 있다면 필수 package
(모듈 인터페이스) 및 package body
(모듈 구현) 과 함께 Ada 앱이 어떻게 구성되어 있는지 살펴보십시오 .
이것은 코딩을위한 것입니다.
유지 관리를 위해 (한 번 코딩하지만 여러 번 유지하는 것을 기억하십시오) 코드를 문서화하는 것이 좋습니다. Doxygen 은 저에게 좋은 선택입니다. 또한 리팩토링 할 수있는 강력한 회귀 테스트 스위트를 구축하는 것이 좋습니다.
OO 기술이 C에서 적용될 수 없다는 것은 일반적인 오해입니다. 대부분은 할 수 있습니다. 단지 작업 전용 구문을 사용하는 언어보다 약간 더 다루기 힘들다는 것입니다.
강력한 시스템 설계의 기초 중 하나는 인터페이스 뒤에 구현을 캡슐화하는 것입니다. FILE*
그리고 (직장하는 기능 fopen()
, fread()
등) 캡슐화 인터페이스를 설정 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 = (Cat*) malloc(sizeof (struct Cat));
x->_base.eat = cat_eat;
x->_base.sleep = cat_sleep;
x->meow = cat_meow;
}
struct IAnimal* pa = CreateACat();
pa->eat(42); /* Calls cat_eat() */
((struct Cat*) pa)->meow(); /* "Downcast" */
모든 좋은 대답.
"데이터 구조 최소화"만 추가합니다. 이것은 C에서 더 쉬울 수 있습니다. 왜냐하면 C ++가 "C with classes"라면, OOP는 여러분이 머릿속의 모든 명사 / 동사를 가져다가 클래스 / 메소드로 바꾸도록 장려하기 때문입니다. 그것은 매우 낭비적일 수 있습니다.
예를 들어, 특정 시점의 온도 판독 값 배열이 있고 Windows에서이를 선 차트로 표시하려고한다고 가정합니다. Windows에는 PAINT 메시지가 있으며이 메시지를 받으면 LineTo 함수를 수행하는 배열을 반복하여 데이터를 픽셀 좌표로 변환 할 때 크기를 조정할 수 있습니다.
내가 너무 많이 본 것은 차트가 점과 선으로 구성되어 있기 때문에 사람들은 각각 DrawMyself가 가능한 점 개체와 선 개체로 구성된 데이터 구조를 구축 한 다음 그 이론에 따라 지속적으로 만들 것입니다. 어떤 식 으로든 "더 효율적"이거나 차트의 일부 위로 마우스를 가져 가서 데이터를 숫자로 표시 할 수 있어야하므로이를 처리하기 위해 객체에 메서드를 구축 할 수 있습니다. 더 많은 개체를 만들고 삭제하는 작업이 포함됩니다.
그래서 여러분은 너무나 읽기 쉬운 엄청난 양의 코드를 얻게되며, 객체 관리에 소요되는 시간의 90 %에 불과합니다.
이 모든 것은 "좋은 프로그래밍 관행"과 "효율성"이라는 이름으로 이루어집니다.
At least in C the simple, efficient way will be more obvious, and the temptation to build pyramids less strong.
The GNU coding standards have evolved over a couple of decades. It'd be a good idea to read them, even if you don't follow them to the letter. Thinking about the points raised in them gives you a firmer basis on how to structure your own code.
I'd suggets you to check out the code of any popular open source C project, like... hmm... Linux kernel, or Git; and see how they organize it.
The number rule for complex application: it should be easy to read.
To make complex application simplier, I employ Divide and conquer.
If you know how to structure your code in Java or C++, then you can follow the same principles with C code. The only difference is that you don't have the compiler at your side and you need to do everything extra carefully manually.
Since there are no packages and classes, you need to start by carefully designing your modules. The most common approach is to create a separate source folder for each module. You need to rely on naming conventions for differentiating code between different modules. For example prefix all functions with the name of the module.
You can't have classes with C, but you can easily implement "Abstract Data Types". You create a .C and .H file for every abstract data type. If you prefer you can have two header files, one public and one private. The idea is that all structures, constants and functions that need to be exported go to the public header file.
Your tools are also very important. A useful tool for C is lint, which can help you find bad smells in your code. Another tool you can use is Doxygen, which can help you generate documentation.
Encapsulation is always key to a successful development, regardless of the development language.
A trick I've used to help encapsulate "private" methods in C is to not include their prototypes in the ".h" file.
I would suggest reading a C/C++ textbook as a first step. For example, C Primer Plus is a good reference. Looking through the examples would give you and idea on how to map your java OO to a more procedural language like C.
참고URL : https://stackoverflow.com/questions/661307/how-should-i-structure-complex-projects-in-c
'Program Tip' 카테고리의 다른 글
매개 변수가 일정 할 수 있습니까? (0) | 2020.10.12 |
---|---|
라이브 MongoDB 데이터를 검색하거나 쿼리하려면 어떻게해야합니까? (0) | 2020.10.12 |
자바 스크립트에서 모든 시간 초과 / 간격을 보십니까? (0) | 2020.10.12 |
파이썬에서 생성자를 복사 하시겠습니까? (0) | 2020.10.12 |
Python에서 open과 codecs.open의 차이점 (0) | 2020.10.12 |