디자인 패턴은 일반적으로 OO 프로그래밍과 관련이 있다는 것을 알고 있지만 C를 프로그래밍 할 때 자주 사용하는 패턴이 있습니까?
나는 고전적인 OO 패턴의 단순한 번역에 관심이 없으며 Duff의 장치는 언급하지 마십시오. 😉
답변
내가 가장 좋아하는 것은 Adam Tornhill 의 “Patterns in C”시리즈입니다 .
또한 : 저는 항상 goto
데코레이터 패턴을위한 훌륭한 가난한 사람의 도구 라고 생각 합니다.
업데이트 : c를 사용해야하는 경우를 제외하고는 C 대신 Rust ( rust-lang.org )를 사용하는 것이 좋습니다 . Rust는 속도와 c와의 바이너리 라이브러리 호환성을 포함하여 c의 모든 이점을 가지고 있지만 컴파일러는 코드가 메모리에 안전하고 데이터 경쟁을 포함하지 않도록하기 위해 많은 복잡성을 처리합니다. 또한 이식 가능하고 일반적인 작업을위한 표준 라이브러리가 있으며 다양한 디자인 패턴에 대해 프로그래밍하기가 훨씬 쉽습니다.
답변
디자인 패턴은 누락 된 언어 기능으로 볼 수 있습니다. 디자인 패턴 소개 : 재사용 가능한 객체 지향 소프트웨어의 요소는 다음과 같이 설명합니다.
프로그래밍 언어의 선택은 자신의 관점에 영향을 미치기 때문에 중요합니다. 우리의 패턴은 스몰 토크 / C ++ 수준의 언어 기능을 가정하고 그 선택에 따라 쉽게 구현할 수있는 것과 구현할 수없는 것이 결정됩니다. 절차 적 언어를 가정했다면 “상속”, “캡슐화”및 “다형성”이라는 디자인 패턴을 포함했을 수 있습니다. 마찬가지로, 일부 패턴은 덜 일반적인 객체 지향 언어에서 직접 지원됩니다. 예를 들어 CLOS에는 방문자와 같은 패턴의 필요성을 줄이는 다중 방법이 있습니다. ( 이탤릭체 내 )
이탤릭체로 된 문장이 질문에 대한 답입니다.
답변
콜백을 통한 다형성 (예 : 표준 라이브러리의 qsort
기능). 필요한 것은 두 요소를 비교하는 방법이며, 그 배열을 정렬 할 수 있습니다.
일반 루틴이 유용하게 처리 할 수 있도록 함수 집합 (vtables)을 사용하여 형식의 관련 속성을 표현하면 이보다 훨씬 더 정교해질 수 있습니다. 예를 들어, 읽기, 쓰기 등은 열린 파일 또는 네트워크 포트를 호출합니다.
답변
네, 있습니다. 지연 초기화, 싱글 톤, 객체 풀, 객체 상태 등은 순수 C에서 쉽게 구현됩니다.
예 (지연 초기화)
#include <stdio.h>
struct foo
{
int payload;
};
int calculate_payload()
{
printf("%s\n", "Performing lengthy initialization...");
return 42;
}
struct foo *get_default_foo()
{
static int foo_calculated = 0;
static struct foo default_foo;
if (!foo_calculated) /* assuming single-threaded access */
{
foo_calculated = 1;
default_foo.payload = calculate_payload();
}
return &default_foo;
}
int main()
{
struct foo *foo1, *foo2;
printf("%s\n", "Starting the program");
foo1 = get_default_foo();
printf("%d\n", foo1->payload);
foo2 = get_default_foo();
printf("%d\n", foo2->payload);
return 0;
}
답변
내 머릿속부터
답변
디자인 패턴은 종종 기존 환경이 제공하는 것에서 한 수준에 불과한 것을 모델링합니다. 표준 라이브러리와 함께 C를 환경으로 사용하면 탁월한 디자인 패턴은 객체 지향입니다.
답변
가상 파일 시스템은 디자인 패턴 학습을위한 완벽한 예입니다.
