혼란스러운. OO는 본질적으로 필수적입니까, 아니면 멀티 파라 디그입니까?

StackOverflow https://stackoverflow.com/questions/553536

  •  23-08-2019
  •  | 
  •  

문제

stackoverflow 답변과 질문을 읽었 듯이 OO가 본질적으로 필수적으로 구획화되어 있다는 인상을 받고 있습니다.

그러나 OO는 코드와 데이터를 실제 대상으로 구획화하는 방법이 아닌가?

그렇다면 왜 다른 수준의 패러다임이 그러한 플랫폼에서 작동하도록 포기할까요?

기본적으로 불변의 객체 기반 일반 유형 시스템 인 IOW는 기능적 모사일 언어가 작동하는 방식이 될 것입니다.

아니면 내가 뭔가를 완전히 놓치고 있습니까?

도움이 되었습니까?

해결책

아니. OO와 명령은 두 가지 직교 개념입니다.

예를 들어:

  • 공통 LISP 객체 시스템은 LISP OO의 예이며 아마도 가장 복잡한 객체 시스템 일 것입니다.
  • OCAML
  • Scala는 매우 유연한 OO 시스템을 갖춘 기능적 언어입니다.
  • Haskell은 높은 가게 된 다형성을 사용하여 객체 지향 코드를 작성할 수 있습니다.

객체 지향적 인 방법에는 여러 가지가 있습니다.

다른 팁

대부분의 OO 언어는 필수적이지만 당신은 당신입니다 ~할 수 있다 다소 기능적인 스타일로 사용하십시오. 일부 기능적 언어는 OO 프레임 워크 위에 앉아 있습니다 (F#은 가장 명백한 예입니다).

나는 거기 있다고 생각한다 많은 "주로 OO"언어가 기능 스타일로 프로그래밍하는 데 더 많은 노력을 기울일 수있는 공간입니다. 불변성에 대한 더 나은 지원은 가장 명백한 특징이며, 아마도 더 나은 유형의 추론이 뒤 따릅니다. (적어도 C#에 대해 이야기 할 때는 기능적 문에서 발을 딛으려고 전통적인 언어의 가장 중요한 예일 것입니다.)

예. Object-Oriented는 프로그래머가 프로그램을 연기하고 상호 작용하는 일련의 상태 객체 (일반적으로 동적 인 언어로 메시지 통과를 통해 정적으로 유형 된 언어로 투여 함)로 프로그램을 표현할 수 있도록하는 프로그래밍 스타일, 그리고 특정 순서로 그렇게합니다.

상태, 동작 및 시퀀스는 절차 적 프로그래밍의 개념이며 비일체적 기능 프로그래밍에는 존재하지 않습니다 (Monads는 순수한 기능 언어 Haskell에서 상태, 동작 및 시퀀스를 구현하는 데 사용됩니다. 그렇지 않으면 이러한 개념이 없습니다).

다른 관점에서 볼 때, 대부분의 사람들은 (재귀 나 RPN이 아닌) 명령 적으로 생각하는 것을 좋아합니다. 이것으로부터 대부분의 언어는 필수적이 될 것입니다.

물론, 많은 문제는 인상적인 접근 방식 (예 : 사용자 인터페이스)으로 표현하기가 훨씬 간단하지만 대부분의 사람들은이 접근 방식에 실제로 편안하지 않습니다. 어떤 사람들은 구타를 떠나는 것을 좋아하지 않는 반면, 다른 사람들은 실제로이 측면에서 문제에 접근하는 데 필요한 정신적 변화를하는 데 어려움을 겪고 있습니다 (변수 및 루프 대신 방법 호출 및 재귀로 생각).

나는 여전히 객체 지향이 본질적으로 필수적인 개념이라고 확신합니다. 그러나 a 최근 질문 일반적으로 프로그래밍 패러다임에 대해 더 많이 생각하게 만들었습니다. 일반적으로 더 포괄적 인 답변을 만들었습니다.

두 가지 주요 프로그래밍 패러다임은입니다 선언적 패러다임, 프로그래머가 추상 관계를 적어 놓는 곳 (따라서 컴파일러에게 무엇 그는 원한다), 그리고 필수 패러다임, 프로그래머가 알고리즘을 적어 두는 곳 (따라서 컴퓨터에 어떻게 그가 원하는 것을 얻기 위해).

패러다임은 선험적 인 언어에 대한 비판적입니다. 프로그램에 대해 생각하고 구성하는 방법에 더 가깝습니다. 그러나 언어가 패러다임을 사용하는 데 얼마나 쉬운 지에는 차이가 있습니다. 언어 의미론과 구문은 관용 코드를 작성하는 방법으로 이어집니다.

선언적 언어의 예는 Prolog입니다. 명령적인 언어의 예는 Fortran입니다. 실제 프로그래머는 모든 언어로 Fortran 프로그램을 쓸 수 있습니다).

동시에 필수적이고 선언적인 코드의 예로, Perl6에서 Fibonnaci-equence의 구현을 고려하십시오.

my @fibonacci-sequence := 0, 1, * + * ... *;

이것은 분명히 시퀀스에 대한 선언적 설명입니다. 그러나 AS * 그리고 ... 유효한 perl6 연산자-모든 별을 사용하여 Lambda-Expressions, 시퀀스 운영자 인 게으른 목록을 생성 할 수 있습니다. 또한 런타임-무질서 코드를 호출하는 명령문이기도합니다.

다른 프로그래밍 패러다임, 특히 기능적 및 객체 지향 프로그래밍을 고려해 봅시다.

그만큼 기능적 패러다임 세트 간의 관계로 계산을 모델링하므로 본질적으로 선언적입니다.

그만큼 객체 지향 패러다임 메시지 전달이라고 불리는 상태의 객체 간의 의사 소통으로 계산을 모델링하기 때문에 본질적으로 필수적입니다.

일부 언어는 순수합니다. 즉, 모든 계산은 패러다임을 준수합니다. 예를 들어, Haskell은 순전히 기능적인 언어이며 Smalltalk는 순전히 객체 지향 언어입니다.

그러나 이것이 기능적 언어가 부활한다는 것을 의미하지는 않습니다. 객체 지향 언어는 필수적 인 응답을 방지합니다. 선언적 프로그래밍. 실제로, 당신은 종종 함수를 필수적으로 사용합니다 - 당신은 입력 값을 입력하여 출력 값을 얻습니다. 컨버스는 객체 지향 프로그래밍의 경우에 적용됩니다. 객체가 수락하는 메시지 세트는 인터페이스를 선언합니다.

어떤 사람들은 OO가 명령적인 개념이라는 것에 동의하지 않기 때문에 여기에 내 추론이 있습니다.

객체 지향 필수 요소 :

  1. 객체는 상태를 유지합니다 (즉, 다른 개체에 대한 참조)
  2. 객체는 메시지를 수신하고 프로세스합니다
  3. 메시지를 처리하면 발생할 수 있습니다
    • 꿀벌 자체 또는 다른 개체로 전송 된 메시지 꿀벌
    • 대상 상태의 변화

이는 OO- 프로그래밍에 변이 가능한 상태가 필요하다는 것을 의미합니다 물체에 의해 잡는 (!). 일련의 객체를 만들어 상태 변경을 시뮬레이션하면 이러한 불변의 불변을 간단하게 해줍니다.

Flamebait : 이 객체 지향 정의에 동의하지 않으면 Alan Kay와 함께 가져 가십시오.

많은 다른 개념들이 객체 지향 프로그래밍의 개념에 기여합니다. 위키 백과 그들 대부분을 나열합니다.

나는 사용함으로써 OOP의 본질을 특성화 할 것이다. 행동이있는 대상.

Wikipedia는 특징입니다 사물 다음 세 가지 속성으로 :

  1. 신원: 다른 개체와 구별되는 물체의 속성
  2. 상태: 객체에 저장된 데이터를 설명합니다
  3. 행동: 객체를 사용할 수있는 객체의 인터페이스의 메소드를 설명합니다.

많은 객체 지향 언어에는 클래스 개념이 있지만 실제로는 또한 프로토 타입 기반 언어 JavaScript처럼.

기능 언어는 또한 클래스 (예 : Haskell의 클래스)를 사용할 수도 있습니다. 그러나 클래스가 있다고해서 객체 지향적이거나 객체 지향 프로그래밍을 허용한다는 의미는 아닙니다. Haskell의 예를 유지하려면 : 당신은 물건조차 없습니다! "정체성"과 같은 개념은 없습니다! 당신이 할 수있는 것은 순수한 기능을 구성하는 것입니다!

누군가가 "클래스"라는 용어를 사용한다고해서 객체 지향 프로그래밍을하고 있다는 의미는 아닙니다!

OOP는 행동을 가진 상태의 대상에 관한 것입니다. 새 개체가 대신 만들 수 있기 때문에 객체의 동작이 해당 객체를 수정할 필요는 없지만 객체의 필요를 완전히 느슨하게 할 수 있습니다. 더 이상 변경 사항이 없기 때문에 한 개체의 변경 사항이 동일한 개체에 대한 다른 참조로 반영되는지 여부는 중요하지 않기 때문에 더 이상 신원이 필요하지 않습니다. 필요한 것은 데이터 숨기기 및 캡슐화를위한 값 (신원 없음) 및 모듈 및/또는 클래스 만 있으면됩니다.

그래서 , 명령 프로그램은 OOP에 내재되어 있습니다.

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