객체 지향 프로그래밍의 대안?


83

OOP는 오늘날 소프트웨어 설계에서 가장 많이 사용되는 프로그래밍 패러다임 일 것입니다. 내 질문은 – 어떤 다른 패러다임 이 그것과 경쟁 할 수 있고 OOP 대신에 설 수 있는가? 그 질문을 명확히하기 위해 다른 패러다임이 무엇인지 묻는 것이 아닙니다. 많이 있지만 어느 쪽인지 알고 싶습니다 ...

  • 이론뿐만 아니라 실제로 사용되었습니다.
  • OOP와 경쟁 할 수 있으므로 최소한의 고통으로 대규모 프로젝트에 사용할 수 있습니다.
  • 비즈니스 로직, 데이터베이스 등이 포함 된 데스크톱 앱을 개발하는 데 사용할 수 있습니다.
  • OOP와 함께 사용되지 않지만 OOP를 대체합니다.

그리고 그것이 있다면, 그것의 장단점은 무엇이며, 왜 OOP보다 낫거나 나쁜지, 어떤 언어가 그것을 사용하는 것이 가장 좋으며, 대중적인 언어에서 그것을 사용하는지, 어떤 디자인 패턴을 가질 수 있습니까? OOP를 완전히 대체 하시겠습니까?


1
@Justin Ardini : 많은 것이 있다는 것을 알고 있지만 어떤 것이 oop과 경쟁 할 수 있습니까? @Tobiasopdenbrouw & Macros : 좋아, 변경되었습니다.
Dariusz Woźniak

당신은 OOP는 당신이 작업에 대한 프로젝트가없는 것 koolaid 삼키지 않는 경우는, 인기가 있기 때문에 OOP는 ... 인기
aoeu256

데이터 지향 프로그래밍은 "db object"메서드가 캡슐화를 제공하는 단일 개체보다 개체 컬렉션 및 해당 관계에 관심이있는 경우 더 쉽습니다. JSON과 표현은 SQL, CSS, HTML, Excel을 달콤하게합니다. 쉘 스크립트는 인기 있고 유용하지만 "프로그래밍"은 OOP 또는 절차를 의미합니다. OOP는 코드의 20 % 임에도 불구하고 Python / JavaScript 프로그램을 유지할 수 있다는 점에 감사드립니다. 클로저와 JSON은 객체 대신 90 %의 시간 동안 사용할 수 있으며 더 간단하고 사용하기 쉽습니다.
aoeu256

답변:


51

함수형 프로그래밍 은 주로 학계에서 널리 사용되는 또 다른 프로그래밍 패러다임입니다. 함수형 프로그래밍 언어의 가장 좋은 예는 HaskellStandard ML 입니다.

함수형 프로그래밍과 객체 지향 프로그래밍의 근본적인 차이점 은 제어 흐름이 아닌 데이터 흐름 의 관점에서 프로그래밍한다는 것입니다 . 좋은 소개는 Simon Peyton-Jones의 Taming Effects with Functional Programming 을 참조하십시오 .

업계에서 사용되는 함수형 프로그래밍의 좋은 예는 Erlang 입니다. 주로 통신, 분산 및 내결함성 시스템에 사용됩니다. 프레젠테이션보기 동시 세계 소프트웨어 - 얼랑 에 의해 조 암스트롱 .

함수형 프로그래밍과 OOP를 결합한 새로운 함수형 프로그래밍 언어도 있습니다. 두 가지 좋은 예는 .NET 플랫폼 용 F # 과 Java 플랫폼 용 Scala 입니다. 종종 다른 언어로 작성된 플랫폼의 기존 라이브러리를 사용할 수 있습니다.

이제 새로운 프로그래밍 언어의 추세는 객체 지향 프로그래밍 및 함수 프로그래밍과 같은 여러 패러다임이 동일한 언어로 결합되는 Multi-paradigm 입니다.


4
Scala는 객체 지향 및 기능 언어의 기능을 통합하는 것을 목표로합니다.
Philipp

5
좋은 대답이지만 함수형 프로그래밍과 객체 지향 프로그래밍은 메달의 양면이 아니라 완벽하게 공존 할 수 있다고 생각합니다. 절차 적 VS 객체 지향적, 명령 적 VS 기능적입니다. Lisp는 널리 사용되는 절차 적 함수 언어이고 Java는 객체 지향 명령형 언어입니다.
fhd

1
@ ventr1s : 예, 함수형 프로그래밍 OOP 대체 할 수 있지만 Scala 및 F #과 같은 언어에서 OOP와 함께 사용할 가능성이 가장 높습니다.
Jonas

1
@ ventr1s : 업계에서 함수형 프로그래밍의 좋은 예는 Erlang으로 작성된 분산 NoSQL 데이터베이스 RIAK입니다. riak.basho.com
Jonas

2
@ ventr1s는 : 함수형 프로그래밍과 디자인 패턴에 대한이 질문을 참조하십시오 : stackoverflow.com/questions/327955/...
조나스

12

절차 적 처리는 OOP가 나타나기 전의 모든 것이 었으며 일부 대규모 실제 응용 프로그램 (사실 대부분은 원래)과 많은 운영 체제를 생성했습니다.

최소한의 고통과 최대의 성능으로 대규모 제품에 확실히 사용할 수 있습니다.


4
예, 수많은 메트릭 연구에 따르면 약 150K LOC에서 가스가 부족한 것으로 나타났습니다. 구조적 프로그래밍이 복잡성 부하에서 어떻게 분해되는지에 대한 논문을 보려면 Petzold의 Windows SDK를 살펴보십시오. 8 개의 인수가있는 함수, 2 개는 6-10 개의 멤버가있는 구조체입니다. 모든 계산 단위에 데이터를 넣거나 빼는 것은 결국 작동하지 않습니다.
Rob은

2
좋아,하지만 얼마나 많은 응용 프로그램이 이렇게 커질까요? OOP의 문제는 이해하기 매우 복잡하고 방대한 애플리케이션을 위해 설계되었지만 작은 애플리케이션에서도 기본값입니다. 이것은 더 작은 앱을 불필요하게 복잡하게 만드는 반대 효과가 있습니다.
niico

객체 지향 프로그래밍으로 인해 생성자 및 긴 getter / setter 메서드가 필요하기 때문에 응용 프로그램이 더 길어지는 경우가 있습니다. C와 같은 초기 절차 적 언어는 메타 프로그래밍을 지원하지 않았으며, 다형성 시스템, 클로저 또는 JSON / 일반 데이터 표현을위한 쉬운 구문이 없었습니다. C는 선택적 인수도 지원하지 않았습니다. 모나드와 매크로를 사용하여 강력한 임베디드 도메인 특정 언어를 구축 할 수 있습니다.
aoeu256

8 개의 인수가있는 함수-기본 인수에 대해 들어 본 적이 있습니까? HashTables + JavaScript, Python 등과 같은 클로저에 대한 절차 + 일급 지원은 어떻습니까? 그들은 많은 코드 없이도 OOP의 많은 장점을 가지고 있습니다.
aoeu256

4

벡터 관계형 데이터 모델링은 네트워크 상주 모델 브로커 인 글로벌 정보 네트워크 아키텍처 내에서 도메인 관련 의미론을 가진 실행 가능한 정보 모델을 생성하는 데 사용됩니다.


4

우선 현재 사용중인 많은 프로그래밍 언어 (특히 "고급 언어")는 다중 패러다임 입니다. 이는 순전히 OOP 인 프로그램을 빌드하지 않는다는 것을 의미합니다 (스몰 토크 또는 에펠을 사용하여 큰 프로젝트를 빌드하는 경우 제외).

예를 들어 PHP 를 살펴보십시오 .

  • OOP의 많은 요소가 있음 (버전 5부터)
  • 이전에는 대부분 절차 적이었습니다.
  • 선언적 프로그래밍 요소 (예 : 배열 함수)가 있습니다.
  • 함수형 프로그래밍의 많은 요소를 구현했습니다 (버전 5.4 이후).

기본적으로 PHP는 많은 다른 패러다임을 하나로 묶습니다 (그리고 "접착 언어"자체입니다).

또한 Java는 객체 지향 패러다임 (예 : 함수형 프로그래밍)이 아닌 많은 개념을 구현합니다.

Wikipedia : https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Imperative_languages(100% 정확하지 않음) 에서 유형별 프로그래밍 언어 목록을 살펴보세요 .

기능적 프로그래밍 (결론적 프로그래밍의 하위 집합)

  • Wideley은 (는 같은 붙어 언어의 일부가되었다 실제로 사용되는 PHP , 또한 자바 함수 프로그래밍 및 많은 다른 사람이 구현 한 개념)
  • 많은 아이디어는 확실히 볼만한 가치가있는 LISP에서 비롯됩니다.
  • 예를 들어 Haskell로 전체 애플리케이션을 빌드 할 수 있으므로 OOP를 "대체"할 수 있습니다.

절차 적 프로그래밍

  • C (대부분 절차 적 언어)는 여전히 가장 널리 사용되는 언어 중 하나입니다.
  • 많은 현대의 접착제 언어는 처음에 절차 적이었습니다.
  • 여전히 많은 프로그램이 대부분 절차 적이므로 원하는 경우 OOP를 "대체"할 수 있습니다.

논리 프로그래밍

  • 가장 눈에 띄는 예는 Prolog입니다. 규칙 기반 논리 쿼리의 이점을 얻는 특정 작업에 사용됩니다.
  • 대규모 프로젝트 구축 측면에서 OOP를 "대체"할 수 없지만 다른 측면에서는 대체 할 수 있습니다.

일반적으로 선언적 / 도메인 특정 언어

  • 프로젝트에서 SQL을 사용하십니까? 그렇다면 그들은 순전히 OOP가 아니며 SQL은 본질적으로 선언적입니다.
  • 많은 도메인 별 언어 (예 : CSS)가 선언적입니다.

일반적인 명령형 프로그래밍

이 목록은 완전하지 않으며 단지 아이디어를 줄 것입니다. 큰 애플리케이션을 작성할 때 일반적으로 많은 다른 패러다임을 사용하고 있으며 사용중인 각 언어도 여러 패러다임을 구현하고 있다는 점에 유의하십시오.

OOP는 일반적으로 데이터를 모델링 할 때 크고 복잡한 관계를 구성하는 데 좋은 선택으로 간주됩니다. 다른 많은 작업을 수행하는 것이 항상 패러다임은 아닙니다.


1

FP-Functional Programming은 매우 오랫동안 사용되어 온 매우 인기있는 프로그래밍 패러다임이며 최근 몇 년 동안 점점 더 두드러지기 시작했습니다. FP는 부작용이없는 가변성, 재귀 및 함수보다 불변성을 선호합니다. 널리 사용되는 fp 언어의 예로는 Erlang, Scala, F #, Haskell 및 Lisp가 있습니다.


-6

현재 OOP를 진정으로 대체 할 수있는 패러다임은 없습니다. OOP의 (이점) 문제는 리소스를 자동으로 해제하고 데이터를 검증하는 등 많은 작업을 수행하며 전 세계 기존 라이브러리의 대부분은 말할 것도없고 코드를 쉽게 검증 할 수 있다는 것입니다. C ++, C # 또는 Java와 같은 OOP 언어로 작성됩니다. 이러한 대규모 도서관없이 잘 지내는 현실은 매우 의심 스럽다.

틈새 시장이나 학문적 세계에서는 많은 함수형 프로그래밍을 찾을 수 있습니다. 그러나 정말로 큰 프로젝트를하고 싶다면 OOP가 유일한 방법입니다.

제네릭 프로그래밍이 새로운 패러다임으로 떠오를 것이라고 생각합니다. 그러나 실제로 아직 개발 단계에 있으며 C ++ / D만이 진정으로 훌륭한 제네릭 프로그래밍을 제공합니다.


3
OOP는 그런 일을하지 않습니다. 더 쉽게 만들 수 있지만 OO 프레임 워크의 디자인에 .Net과 같이 포함되거나 기꺼이 작성하려는 경우에만 가능합니다.
Matt Ellen

기술적으로 당신 말이 맞습니다. 그러나 현실은 모든 인기있는 OO 언어가 객체 지향의 기능으로 리소스 관리를 포함한다는 것입니다. 당신은 그것을 포함하지 않는 언어를 지원하는 직접적인 객체를 찾기가 어려울 것입니다. 그리고 OP는 이론이 아닌 실천에 분명히 관심이 있습니다.
Puppy

3
자원 관리는 객체 지향의 기능이 아닙니다. 자원 관리는 명령형 프로그래밍 언어의 기능이며 객체 지향 일 수도 있고 아닐 수도 있습니다. 시스템 자원을 명시 적으로 관리해야하는 순전히 기능적인 언어는 없습니다.
Matthew J Morrison
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.