문제

이러한 프로그래밍 패러다임의 차이점은 무엇이며 특정 문제에 더 적합하거나 다른 제품보다 유용한 사례를 선호합니까?

건축 예제에 감사드립니다!

도움이 되었습니까?

해결책

그들 모두는 그들 자신의 방식으로 훌륭합니다. 그들은 단순히 같은 문제에 대한 다른 접근법입니다.

순전히 절차 적 스타일에서 데이터는 작동하는 기능에서 분리되는 경향이 있습니다.

객체 지향 스타일에서 데이터는 기능 모음을 가지고 다니는 경향이 있습니다.

기능적 스타일에서 데이터와 기능은 기능이 실제로 사용되는 방식에있어 더 많은 유연성을 제공하는 동시에 (LISP 및 체계에서와 같이) 서로 공통점을 갖는 경향이 있습니다. 알고리즘은 또한 루프와 반복보다는 재귀 및 구성 측면에서 정의되는 경향이 있습니다.

물론 언어 자체는 어떤 스타일이 선호되는지에만 영향을 미칩니다. Haskell과 같은 순수한 기능적 언어로도 절차 적 스타일 (낙담하지는 않지만)으로 쓸 수 있으며 C와 같은 절차 언어로도 객체 지향적 인 스타일 (GTK+ 및와 같이 프로그래밍 할 수 있습니다. EFL API).

분명히, 각 패러다임의 "장점"은 단순히 알고리즘과 데이터 구조의 모델링에 있습니다. 예를 들어, 알고리즘에 목록 및 트리가 포함되면 기능 알고리즘이 가장 합리적 일 수 있습니다. 또는 예를 들어, 데이터가 고도로 구조화되어 있다면 언어의 기본 패러다임 인 경우 객체로 구성하는 것이 더 합리적 일 수 있습니다. Haskell 또는 ML과 같은 언어의 기본 패러다임입니다.

당신이 사용하는 선택은 단순히 프로젝트에 더 의미가있는 것과 언어가 지원하는 추상화입니다.

다른 팁

이용 가능한 도서관, 도구, 예 및 지역 사회가 요즘 패러다임을 완전히 뛰어 넘다고 생각합니다. 예를 들어, ML (또는 무엇이든)는 최고의 다목적 프로그래밍 일 수 있습니다. 언어 그러나 당신이하고있는 일에 대한 좋은 라이브러리를 얻을 수 없다면 당신은 망가졌습니다.

예를 들어, 비디오 게임을 만드는 경우 C ++에는 더 좋은 코드 예제와 SDK가 있으므로 아마도 더 나은 것이 더 좋습니다. 작은 웹 애플리케이션의 경우 훌륭한 파이썬, PHP 및 Ruby 프레임 워크가있어 매우 빠르게 실행할 수 있습니다. Java는 컴파일 타임 체크 및 엔터프라이즈 라이브러리 및 플랫폼으로 인해 대규모 프로젝트를위한 훌륭한 선택입니다.

예전에는 다른 언어의 표준 라이브러리가 꽤 작고 C ++, 어셈블러, ML, LISP 등으로 매우 작고 쉽게 복제 된 경우였습니다. 네트워크 커뮤니케이션, 암호화, 그래픽, 데이터 파일 형식 (XML 포함)과 마찬가지로 균형 잡힌 트리 및 해시블과 같은 기본 데이터 구조조차도 남았습니다!

Python, PHP, Ruby 및 Java와 같은 현대 언어는 이제 훨씬 더 괜찮은 표준 라이브러리가 제공되며 라이브러리가 서로 충돌하는 것을 막기 위해 네임 스페이스를 채택하여 쉽게 사용할 수있는 좋은 타사 도서관이 많이 있습니다. 라이브러리의 메모리 관리 체계를 표준화하기위한 쓰레기 수집.

이러한 패러다임은 상호 배타적 일 필요는 없습니다. Python을 보면 기능과 클래스를 지원하지만 동시에 기능을 포함한 모든 것이 객체입니다. 기능적/OOP/절차 스타일을 한 조각의 코드로 혼합하고 일치시킬 수 있습니다.

내 말은, 기능적 언어에서 (적어도 Haskell에서, 내가 연구 한 유일한 것은) 진술이 없다는 것입니다! 함수는 그 안에 하나의 표현 만 허용됩니다 !! 그러나 기능은 일류 시민이며 다른 많은 능력과 함께 매개 변수로 전달할 수 있습니다. 그들은 몇 줄의 코드로 강력한 일을 할 수 있습니다.

C와 같은 절차 적 언어에서는 기능을 전달할 수있는 유일한 방법은 기능 포인터를 사용하는 것이며, 그 자체만으로는 많은 강력한 작업을 가능하게하지 않습니다.

Python에서는 기능이 일류 시민이지만 임의의 수의 진술을 포함 할 수 있습니다. 따라서 절차 코드가 포함 된 함수를 가질 수 있지만 기능 언어와 마찬가지로 전달할 수 있습니다.

OOP도 마찬가지입니다. Java와 같은 언어는 수업 이외의 절차/기능을 작성할 수 없습니다. 기능을 전달하는 유일한 방법은 그 기능을 구현하는 객체로 랩핑 한 다음 해당 객체를 전달하는 것입니다.

파이썬에서는이 제한이 없습니다.

GUI의 경우 객체 지향 패러다임이 매우 적합하다고 말합니다. 창은 객체이고 텍스트 상자는 객체이며 괜찮은 버튼도 하나입니다. 반면에 문자열 처리와 같은 작업은 훨씬 적은 오버 헤드로 수행 할 수 있으며, 따라서 간단한 절차 적 패러다임으로 더 간단합니다.

나는 그것이 언어의 문제라고 생각하지 않습니다. 거의 모든 인기있는 언어로 기능적, 절차 적 또는 객체 지향을 작성할 수 있지만 일부는 추가 노력 일 수 있습니다.

귀하의 질문에 답하려면 두 가지 요소가 필요합니다.

  1. 다양한 아키텍처 스타일/패턴의 특성에 대한 이해.
  2. 다른 프로그래밍 패러다임의 특성에 대한 이해.

소프트웨어 아키텍처 스타일/패턴 목록이 소프트웨어 아키텍처 기사 Wikipeida에서. 그리고 웹에서 쉽게 조사 할 수 있습니다.

간단히 말해서 절차는 절차를 따르는 모델에 적합하며 OOP는 디자인에 적합하며 기능은 높은 수준의 프로그래밍에 좋습니다.

각 패러다임에서 역사를 읽고 사람들이 왜 그것을 창조하고 쉽게 이해할 수 있는지 확인해야한다고 생각합니다.

둘 다 이해 한 후에는 아키텍처 스타일/패턴의 항목을 프로그래밍 패러다임에 연결할 수 있습니다.

나는 그들이 종종 "대"가 아니라고 생각하지만 결합 할 수 있습니다. 나는 또한 종종 당신이 언급 한 단어는 단지 유행어 일 뿐이라고 생각합니다. 그들이 가장 치열한 전도자이더라도 "대상 지향적"이 무엇을 의미하는지 실제로 아는 사람은 거의 없습니다.

내 친구 중 한 명이 Nvidia Cuda. 응용 프로그램은 OOP 패러다임에 매우 잘 맞으며 문제는 모듈로 깔끔하게 분해 될 수 있습니다. 그러나 Cuda를 사용하려면 지원하지 않는 C를 사용해야합니다. 계승. 그러므로 당신은 영리해야합니다.

a) 당신은 어느 정도 상속을 모방 할 영리한 시스템을 고안합니다. 할 수 있습니다!

i) a 후크 시스템, 부모 P의 모든 어린이 C가 기능 F에 대한 특정 재정의를 가질 것으로 예상합니다. 어린이가 재정의를 등록하게 만들 수 있습니다.

ii) 구조물을 사용할 수 있습니다 메모리 정렬 아이들을 부모로 캐스팅하는 기능.

이것은 깔끔 할 수 있지만 미래를 방지하고 신뢰할 수있는 솔루션을 찾는 것은 쉽지 않습니다. 당신은 시스템을 설계하는 데 많은 시간을 할애 할 것이며 프로젝트의 반쯤 문제가 발생하지 않을 것이라는 보장은 없습니다. 구현 다중 상속 거의 불가능하지는 않지만 더욱 어렵습니다.

b) 일관된 이름 지정 정책 및 사용을 사용할 수 있습니다. 나누고 정복하십시오 프로그램을 만들기위한 접근 방식. 상속은 없지만 기능은 작고 이해하기 쉽고 지속적으로 형식화되기 때문에 필요하지 않습니다. 작성해야 할 코드의 양이 올라가고 집중력을 유지하기가 매우 어렵고 쉬운 솔루션 (해킹)에 굴복하지 않습니다. 그러나이 닌자 코딩 방식은 코딩의 C 방법입니다. 낮은 수준의 자유와 좋은 코드를 작성하는 것 사이의 균형을 유지합니다. 이를 달성하는 좋은 방법은 기능적 언어를 사용하여 프로토 타입을 작성하는 것입니다. 예를 들어, Haskell 프로토 타이핑 알고리즘에 매우 좋습니다.

나는 접근 경향 b. 나는 접근 방식 A를 사용하여 가능한 해결책을 썼는데 솔직히 말해서, 그 코드를 사용하는 것은 매우 부자연 스럽다고 느꼈습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top