객체 지향 프로그래밍이 성공한 이유는 무엇입니까? [닫은]


17

객체 지향 프로그래밍을 그렇게 많이 성공시킨 당신의 특징은 무엇입니까?

  1. 메시지 전달
  2. 계승
  3. 다형성
  4. 캡슐화

또는 소개하고 싶은 다른 기능이 있습니다.

또한 추상 데이터 형식과 객체 지향 프로그래밍의 관계가 무엇인지 알고 싶습니다.


인기와 성공은 동의어가 아닙니다
kevin cline

답변:


76

객체 지향 프로그래밍의 가장 중요한 특징은 복잡성 관리라는 것 입니다.

인간의 두뇌는 한 번에 많은 개념을 가질 수 있습니다. 7 +/- 2 개의 독립적 인 항목을 기억하는 데 종종 인용되는 한계가 떠 오릅니다.

직장에서 600kloc 시스템을 작업 할 때 한 번에 모든 것을 머리에 담을 수 없습니다. 그렇게해야한다면 훨씬 작은 시스템 에서만 작업 할 수있을 것 입니다.

다행히도, 난 필요가 없습니다. 우리가 그 프로젝트에서 사용한 다양한 디자인 패턴과 다른 구조는 전체 시스템을 한 번에 처리 할 필요가 없다는 것을 의미합니다. 개별적인 부분을 선택하여 더 넓은 애플리케이션에 적합하다는 것을 알고 작업 할 수 있습니다. 잘 정의 된 방식으로.

중요한 모든 OO 개념은 복잡성을 관리하는 방법을 제공합니다.

캡슐화 -서비스가 어떻게 구현되는지 걱정하지 않고 다양한 서비스를 제공하는 외부 API를 다루겠습니다.

추상화 -필수 특성에 집중하고 관련성이없는 것을 무시하겠습니다.

구성 -새로운 조합으로 이미 작성된 구성 요소를 재사용 할 수 있습니다.

다형성 -다른 객체가 다른 방식으로 서비스를 제공하는 방법에 대해 걱정하지 않고 서비스를 요청할 수 있습니다.

상속 -인터페이스 나 구현을 재사용하여 이전과 다른 부분 만 제공합니다.

단일 책임 원칙 -각 개체의 목적을 명확하고 간결하게 유지하므로 추론하기 쉽습니다.

Liskov Substitution Prinicple- 홀수 종속성을 도입하여 서로 함정을 배치하지 마십시오

개방 / 폐쇄 원칙 -기존 코드를 위반할 위험이없는 방식으로 확장 및 수정을 허용합니다.

의존성 주입 -컴포지션을 한 단계 더 발전시키고 구성 요소를 훨씬 나중에 함께 모 읍시다.

인터페이스 지향 개발 -추상화를 다음 단계로 나아가고 구체적인 구현에 의존하지 않고 추상화에만 의존하도록합시다.


6
+1. 한 번만 투표 할 수 있는데, 이는 더 많은 가치가 있습니다.
Richard

1
이것에 대한 추론이 있는데, 지금은 참조를 찾을 수 없다는 것이 부끄러운 일이지만, 그것을 참조하고 주석을 편집하는 것을 기억하려고 노력할 것입니다. 따라서 코드 검토 관행에 대한 연구에 따르면 코드 검토가 절차 코드보다 OO 코드에서 버그를 찾는 데 더 오래 걸리는 것으로 나타났습니다. 흐름이 ​​OO 코드에서 더 많이 건너 뛰기 때문입니다. TDD 및 페어 프로그래밍과 같은 연습은이를 완화하지만 여전히 흥미로운 (나에게 예기치 않은) 결과입니다.

5
이것은 완전한 답변 일 수 있습니다. 정보가 가득 차 있지만 충분히 짧아서 독자가 소설을 읽을 필요가 없습니다. 브라보
팀 클라 슨

@Graham Lee : 그 연구를 읽는 데 관심이 있습니다.
Frank Shearar

2
@ 프랭크 @ 베반 : portal.acm.org/citation.cfm?id=337343

13

그래픽 사용자 인터페이스. 80 년대 후반, 90 년대 초, Mac, Amigas, Atari ST, Windows 및 GEM이 문자 기반 사용자 인터페이스를 대체하기 시작했을 때 C와 같은 언어는 GUI 프로그램을 작성하기에 적합하지 않다는 것이 분명해졌습니다. 전통적인 데이터 처리는 절차 적 언어로도 수행 될 수있는 "입력 데이터-> 처리-> 출력 데이터"스키마로 간주되지만, OO 기능은 GUI의 고유 한 복잡성을 처리하는 데 편리했습니다.


1
GUI 애플리케이션을 언급하면 ​​+1입니다. 객체 지향 (object-orientation)은 GUI를 구현할 수있게 해주는 도구였으며, 그렇지 않으면 절차 적 코드로는 관리하기가 매우 어려웠습니다.
Giorgio

7

캡슐화에서 제공하는 데이터 숨기기.


이것이 답입니까? ADT는 데이터 숨기기 기능을 제공합니다 ( "데이터 추상화"라고하는 이유)
Frank Shearar

@ Frank, 그는 특정 기능을 요구 했으며이 답변을 쓸 때 다른 사람 만 있었고 복제하지 않으려 고했습니다.

충분하지만 캡슐화는 정확히 OO에만 국한되지 않습니다. 나는 이것을 직접 확인해야하지만, 우리가 OO 전에 오래 캡슐화를하고 있다고 확신합니다.
Frank Shearar

1
@Frank, OO에만 국한된 것이 아니라는 점에 동의합니다. 주요 기능 중 하나 일뿐입니다.

그것은 대부분의 OOPL에 해당하지만 전부는 아닙니다. CLOS는 주목할만한 예외입니다.
Frank Shearar

7

다른 답변 중 아직 언급되지 않은 기능 : 도메인 모델링 . 사람들은 객체로 또는 객체로하는 일과 본질적인 속성을 가진 객체에 대해 생각하는 경향이 있기 때문에 객체 지향 소프트웨어를 사용하여 문제 나 워크 플로를 모델링하는 것은 매우 쉽습니다. 기본적으로 코드에서 명사, 동사 및 형용사를 처리하는 기존 기능을 사용할 수 있습니다.


6

상속이 OOP의 가장 중요한 포인트라고 생각합니다.

[게임 개발에서] 렌더링 메서드 및 속성을 사용하여 Drawable 클래스와 같은 것을 만들고 Drawable에서 상속되는 Spaceship and Planet 클래스를 만들 수 있습니다. 그 [및 다른 Sprite 자식]에서 모든 객체를 가져 와서 drawableObjArray를 던져 모든 객체에 대해 draw 메소드를 호출하십시오. Drawable이라는 것을 알아야합니다.


2
정말?? 다형성은 더 중요하며 상속을 필요로하지 않습니다 (이론적 관점에서).
Thomas Eding

가상 함수조차 필요하지 않으며 함수 포인터 만 사용하십시오.
Calmarius

1
Alan Kay의 OO라는 원래 개념에는 상속이 포함되지 않았으며 이전 시스템에서 구현 된 방식이 마음에 들지 않기 때문입니다.
Michael Borgwardt


2

그것은 인간의 마음의 사물 조직을 사물에 사용하도록 장려하기 때문에 다소 성공합니다. 사람들은 일반적으로 차이점, 유사점 및 행동과 같은 사물의 관계를 보는 데 능숙합니다. OO는 세계의 인간 개념화를 모방하는 소프트웨어 개발을 장려합니다.

우리가 세상을 보는 것과 비슷한 방식으로 소프트웨어 개발을하면 마음이 복잡성을 쉽게 처리 할 수 ​​있습니다.


절차에 대한 경험이 많을 수도 있지만 두 방법을 모두 사용한 후에도 여전히 OOP보다 절차가 더 직관적이라는 것을 알 수 있습니다. 그래도 나는 여전히 두 스타일의 좋은 부분을 좋아한다.
Juha Untinen

1

여기에서 " ADT vs objects "가 여러 번 요청되었습니다. 한 줄의 대답은 "ADT와 객체는 서로의 역수입니다. 하나는 다른 하나는 깔끔하게 추상화 할 수 없으며, 각각 다른 방식으로 유연성을 허용합니다."

자세한 답변은 William Cook의 데이터 이해 이해에 관한 재검토를 참조하십시오 . 간단히 말해서 객체를 사용하면 일부 데이텀의 여러 구현 / 표현을 쉽게 사용할 수 있습니다 (목록처럼 보이는 것은 배열 또는 자체 균형 트리 또는 ...).하지만 새 작업을 추가하기가 어렵습니다 (왜냐하면 ADT를 사용하면 데이터 유형에 새 작업을 쉽게 추가 할 수 있지만 여러 구현을 수행하기 어렵습니다.

편집 : 메시지 전달이 OO를 성공적으로 만들었다 고 말했습니다. 사람들이 OO로 생각하는 대부분의 언어는 메시지 전달을 사용하지 않기 때문에 Jonas의 의견을 바탕으로 옳지 않습니다. 그것이 옳지 않기 때문에 나는 내 대답에서 그것을 뽑았습니다.


1
성공적인 OOP 언어 중 어느 것도 그것을 사용하지 않기 때문에 메시지 전달은 답이 될 수 없습니다.
조나스

귀하의 OO가 반드시 내 OO 인 것은 아닙니다. OO라고하는 대부분의 언어는 Alan Kay의 정의에 따라 다릅니다. 정확한 인용은 잊었지만 Kay 's는 객체가 스몰 토크에서 중요한 것이 아니라 메시지 전달 (그리고이 부분을 놓친 부분)이라고 말했다.
Frank Shearar

@Jonas 나는 질문과 대답을 다시 읽었을 때 "OO는 성공하지 못합니다. 언어가 적기 때문에 O는 성공하지 못합니다." 하지만 난 내 화복을 입을 때만 그런 말을 해요.
Frank Shearar

0

나의 3 대 특징. 개체 구성-개체를 공동 작업 할 수 있습니다. 다형성-런타임시 동적 동작을 지원합니다. 상속-코드를 재사용하고 메소드 재정의를 통해 동작을 수정합니다.

ADT-Pascal과 같은 객체 지향이 아닌 언어에서도 사용할 수 있습니다. 스택 또는 큐는 ADT의 예입니다.


"ADT-Pascal과 같은 객체 지향이 아닌 언어에서도 사용할 수 있습니다. 스택 또는 대기열은 ADT의 예입니다.": True. 그러나 OOP를 사용하면 ADT의 인터페이스를보다 쉽게 ​​정의하고 서로 교환 가능한 다른 구현 (인터페이스 / 추상 클래스 <---> 하위 클래스 / 구체 클래스)을 제공 할 수 있습니다. 내가 아는 한 파스칼에서는 쉽지 않습니다.
조르지오

0

간단히 말해서 OOP는 재사용 성 및 캡슐화의 핵심으로, API를 호출하고 가장 자주 원하는 날을 할 수 있기 때문에이 시대의 프로그래머가 쉽게 생활 할 수 있도록하는 큰 프레임 워크를 생성합니다.

질문은 OOP의 4 가지 기능에 관한 것이므로

  1. 상속 및 4. 캡슐화가 가장 중요한 기능이며 다른 두 개는 처음 두 개를 달성하는 데 매우 필요합니다.

1. 메시지 전달과 3. 다형성은 실제로 2. 상속과 4. 캡슐화를 지원합니다.

  1. 상속 및 4. 캡슐화는 OOP 성공의 열쇠입니다

상속은 필요하지 않으며, 대부분 OOP의 정의 구성 요소 또는 매우 바람직한 부분입니다. 캡슐화는 일반적으로 프로그래밍을위한 좋은 원칙입니다. OOP에서 개발 한 것이 아니며 OOP에서만 사용되는 것은 아닙니다.
sara

-1

제 생각에 마지막 세 가지 기능은 OOP의 광범위한 사용에 영향을 준 가장 중요한 기능입니다.

2. Inheritance
3. Polymorphism
4. Encapsulation

편집 : 또 다른 요점은 Visual Studio 및 Eclipse와 같은 IDE 및 그래픽 인터페이스 개발 환경입니다. OOP 언어를 수용함에 따라 점점 더 많은 디자인이 OOP를 향한 경향이 있습니다.

물론 SOLID Principles 는 소프트웨어 제품 ROCK를 견실하게 제공 할 수있는 시대입니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.