문제

의미 있는 용어가 없는 논쟁은 무의미한, 나는 방에 있는 코끼리를 가리키며 이렇게 물어볼 것이라고 생각했습니다.언어를 "객체 지향"으로 만드는 것은 정확히 무엇입니까?나는 여기서 교과서적인 답변을 찾고 있는 것이 아니라, 그것이 무엇이든 귀하의 도메인에서 잘 작동하는 OO 언어에 대한 귀하의 경험을 바탕으로 한 답변을 찾고 있습니다.

먼저 대답하는 데 도움이 될 수 있는 관련 질문은 다음과 같습니다.객체지향 언어의 원형은 무엇이며 그 이유는 무엇입니까?

도움이 되었습니까?

해결책

객체 지향에 대한 정의 물론이다 거대한 벌레 캔, 하지만 여기에 내 2센트가 있습니다.

나에게 있어 객체 ​​지향은 메시지를 보내 협력하는 객체에 관한 것입니다.이것이 제가 보기에는 객체지향 언어의 가장 중요한 특성입니다.

객체 지향 언어가 가져야 하는 모든 기능을 순서대로 나열해야 한다면 다음과 같을 것입니다.

  1. 다른 객체에게 메시지를 보내는 객체
  2. 모든 것은 객체이다
  3. 후기 바인딩
  4. 하위 유형 다형성
  5. 상속 또는 이와 유사한 표현 대표단
  6. 캡슐화
  7. 정보 은닉
  8. 추출

분명히 이 목록은 객체 지향으로 널리 간주되는 매우 다양한 언어를 제외하기 때문에 매우 논란의 여지가 있습니다. 자바, 씨# 그리고 C++, 모두 1, 2, 3항을 위반합니다.그러나 이러한 언어가 객체 지향 프로그래밍을 허용한다는 점에는 의심의 여지가 없습니다. ) 심지어 이를 촉진하기도 합니다(C에서는 그렇지 않습니다).그래서 나는 이러한 요구 사항을 충족하는 언어를 "순수한 객체 지향"이라고 부르게 되었습니다.

나는 전형적인 객체 지향 언어로 이름을 붙일 것입니다. 본인 그리고 뉴스피크.

둘 다 위에서 언급한 요구 사항을 충족합니다.둘 다 다음에서 영감을 얻었으며 후속작입니다. 잡담, 둘 다 실제로 어떤 의미에서는 "더 많은 OO"가 됩니다.내가 Self와 Newspeak에 대해 좋아하는 점은 둘 다 패러다임을 보내는 메시지를 극단적으로 받아들인다는 것입니다(Newspeak는 Self보다 훨씬 더 그렇습니다).

뉴스피크에서는 모든 것 메시지 전송입니다.인스턴스 변수, 필드, 속성, 상수, 클래스 이름이 없습니다.이들은 모두 getter 및 setter를 사용하여 에뮬레이션됩니다.

셀프에는 다음이 있습니다. 수업 없음, 개체만.이는 OO가 무엇인지 강조합니다. 정말 에 대한:클래스가 아닌 객체.

다른 팁

Booch에 따르면 다음 요소는 다음과 같습니다. 주요 :

  • 추상화
  • 캡슐화
  • 모듈성
  • 계층 (상속)

    미성년자 :

    • 입력
    • 동시성
    • 지속성

기본적으로 객체 지향은 실제로 "메시지 전달"로 귀결됩니다.

절차적 언어에서는 다음과 같은 함수를 호출합니다.

  f(x)

그리고 f라는 이름은 아마도 컴파일 타임에 특정 코드 블록에 바인딩될 것입니다.(이것이 고차 함수나 함수에 대한 포인터가 있는 절차적 언어가 아니라면 그 가능성을 잠시 무시해 보겠습니다.) 따라서 이 코드 줄은 단 하나의 명확한 것을 의미할 수 있습니다.

객체 지향 언어에서는 아마도 다음과 같이 객체에 메시지를 전달합니다.

 o.m(x) 

이 경우.m은 코드 블록의 이름이 아니라 "메서드 선택기"이며 실제로 호출되는 코드 블록은 어떤 방식으로든 객체 o에 따라 다릅니다.이 코드 줄은 o에 따라 상황에 따라 다른 의미를 가질 수 있기 때문에 더 모호하거나 일반적입니다.

대부분의 OO 언어에서 객체 o에는 "클래스"가 있으며 클래스는 호출되는 코드 블록을 결정합니다.몇 가지 OO 언어(가장 유명한 Javascript)에서는 클래스가 없지만 런타임에 메서드가 직접 첨부되거나 프로토타입에서 상속됩니다.

나의 경계는 언어가 OO가 되기 위해서는 클래스나 상속이 필요하지 않다는 것입니다.그러나 이러한 다형성 메시지 처리는 필수적입니다.

C에서 함수 포인터를 사용하여 이를 위조할 수 있지만 C를 OO 언어라고 부르기에는 충분하지 않습니다. 자체 인프라를 구현해야 하기 때문입니다.그렇게 할 수 있고 OO 스타일도 가능하지만 언어는 이를 제공하지 않습니다.

실제로 OO 인 언어가 아니라 코드입니다.

객체 지향 C 코드 (원하는 경우 구조체 및 함수 포인터 멤버 포함)를 작성할 수 있으며 이에 대한 꽤 좋은 예를 보았습니다.(Quake 2/3 SDK가 떠 오릅니다.) C ++로 절차 적 (즉, OO가 아닌) 코드를 작성하는 것도 확실히 가능합니다.

그렇다면 "객체 지향 언어"로 만드는 좋은 OO 코드를 작성하기위한 언어의 지원이라고 말하고 싶습니다.예를 들어 일반적인 멤버 함수가 무엇인지에 대해 C의 구조체에서 함수 포인터 멤버를 사용하는 데 결코 신경 쓰지 않을 것입니다.따라서 C는 OO 언어가 아니라고 말할 것입니다.

(이를 확장하면 모든 단계에 대한 필수 "자기"참조와 init 라는 생성자도 포함되어있어 Python이 객체 지향적이지 않다고 말할 수 있습니다. 그러나 그것은 종교적 토론입니다.)

Smalltalk는 일반적으로 원형 OO 언어로 간주되지만 Simula는 종종 첫 번째 OO 언어로 인용됩니다.

현재 OO 언어는 가장 많은 개념을 차용 한 언어로 느슨하게 분류 할 수 있습니다.

  • Smalltalk 유사 : Ruby, Objective-C
  • 시뮬 라 유사 : C ++, Object Pascal, Java, C #

내가 말할 수있는 한, 언어를 "객체 지향"으로 만드는 주요 관점은 데이터 그룹화 개념과 해당 데이터에 대해 작동하는 메서드를 지원하는 것입니다. 일반적으로 클래스, 모듈, 상속, 다형성을 통해 달성됩니다.등

사람들의 생각 (생각?) 객체 지향에 대한 개요는 이 토론 을 참조하세요.의미합니다.

"기본"OO 언어에 관해서는 Kristopher가 지적했듯이 실제로 Smalltalk입니다.

클래스, 메서드, 속성, 캡슐화, 데이터 숨김, 상속, 다형성, 추상화 지원 ...?

이론적 의미를 무시하고

" 'class'라는 키워드가있는 모든 언어":-P

추가적으로 aib가 말한 것을 말하자면, 사용 가능한 표준 라이브러리가 객체 지향이 아닌 한 언어는 실제로 객체 지향이 아니라고 말하고 싶습니다.가장 큰 예는 PHP입니다.모든 표준 객체 지향 개념을 지원하지만 표준 라이브러리의 상당 부분이 객체 지향이 아니라는 사실은 코드를 객체 지향 방식으로 작성하는 것이 거의 불가능하다는 것을 의미합니다.

모든 표준 라이브러리에서 모든 함수 호출에 mysql_ 및 pgsql_과 같은 접두사를 추가하도록 요구하는 경우 네임 스페이스를 도입하는 것은 중요하지 않습니다. 실제 API에서 네임 스페이스를 지원하는 언어에서는 제거 할 수 있습니다.mysql_로 함수를 구성하고 파일 상단에 간단한 "include system.db.mysql. *"만 있으면 이러한 항목의 출처를 알 수 있습니다.

수업을 만들 수 있다면 객체 지향적입니다.
예 : 자바는 객체 지향이고 자바 스크립트는 그렇지 않으며 C ++는 일종의 "객체 호기심"언어처럼 보입니다.

내 경험상 언어는 객체 지향이 아니라 코드가 그렇다.

몇 년 전 저는 OO를 만들기 시작했을 때 실제로 객체 지향 기능을 적용하지 않는 AppleScript로 프로그램 모음을 작성했습니다.AppleScript로 Objects를 작성하는 것은 서투른 일이지만, 시간을 들여 방법을 알아 내면 클래스, 생성자 등을 생성 할 수 있습니다.

언어는 도메인의 올바른 언어였습니다. 입력 파일을 기반으로 일부 자동 작업을 수행하기 위해 Macintosh의 여러 프로그램이 함께 작동하도록합니다.문제 해결, 테스트 및 이해가 더 쉬운 코드가 생성 되었기 때문에 객체 지향 스타일을 자체적으로 시행하는 것이 올바른 프로그래밍 선택이었습니다.

프로 시저에서 OO로 코드를 변경할 때 가장 눈에 띄는 기능은 캡슐화였습니다. 속성과 메서드 호출 모두입니다.

단순화 :( 보험 캐릭터 비교)

1- 다형성 2- 상속 3- 캡슐화 4- 재사용. :)

개체 : 개체는 데이터 저장소입니다. 예를 들어 MyList가 ShoppingList 개체 인 경우 MyList는 쇼핑 목록을 기록 할 수 있습니다.

클래스 : 클래스는 객체의 한 유형입니다. 동일한 클래스의 많은 객체가 존재할 수 있습니다. 예를 들어 MyList와 YourList는 모두 ShoppingList 객체 일 수 있습니다.

메소드 : 객체 또는 클래스에서 작동하는 절차 또는 함수입니다. 메서드는 특정 클래스와 연결됩니다. 예를 들어 addItem은 ShoppingList 개체에 항목을 추가하는 메서드 일 수 있습니다. 때로는 메서드가 클래스 패밀리와 연결됩니다. 예를 들어, addItem은 ShoppingList가 하나의 유형 인 모든 목록에서 작동 할 수 있습니다.

상속 : 클래스는보다 일반적인 클래스에서 속성을 상속 할 수 있습니다. 예를 들어 ShoppingList 클래스는 List 클래스에서 항목 시퀀스를 저장하는 속성을 상속합니다.

다형성 (Polymorphism) : 하나의 메서드 호출이 여러 다른 객체 클래스에서 작동하도록하는 기능은 해당 클래스가 메서드 호출의 다른 구현을 필요로하는 경우에도 마찬가지입니다. 예를 들어, ShoppingList에 항목을 추가하는 것이 ShoppingCart에 항목을 추가하는 것과 완전히 다른 경우에도 모든 종류의 List에 대해 한 줄의 코드로 "addItem"메소드를 호출 할 수 있습니다.

객체 지향 : 각 객체는 자체 클래스와 해당 클래스의 객체를 조작하는 메서드를 알고 있습니다. 각 ShoppingList와 각 ShoppingCart는 어떤 addItem 구현이 적용되는지 알고 있습니다.

이 목록에서 객체 지향 언어와 절차 적 언어 (C, Fortran, Basic, Pascal)를 진정으로 구별하는 것은 다형성입니다.

출처 : https://www.youtube.com / watch? v= mFPmKGIrQs4 & list= PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

여러분과 공유하게되어 기쁩니다. 매우 흥미롭고 도움이되었습니다. 이것은 프로그래머가 아닌 Steve가 OOP를 간단한 용어로 설명하는 1994 년 Rolling Stone 인터뷰에서 발췌 한 것입니다.

Jeff Goodell : 객체 지향 소프트웨어가 정확히 무엇인지 간단히 설명해 주시겠습니까?

스티브 잡스 : 사물은 사람과 같습니다. 그들은 일을하는 방법에 대한 지식과 기억을 가지고있는 것을 살아 숨 쉬고 있습니다. 그리고 아주 낮은 수준에서 그들과 상호 작용하기보다는 우리가 바로 여기서하는 것처럼 매우 높은 수준의 추상화에서 그들과 상호 작용합니다.

예 : 내가 당신의 세탁물 물건이라면, 당신의 더러운 옷을 제게주고 "내 옷을 세탁 해 줄래요?"라는 메시지를 보내 주시면됩니다. 나는 샌프란시스코에서 가장 좋은 세탁소가 어디에 있는지 알고 있습니다. 저는 영어로 말하고 주머니에 달러가 있습니다. 그래서 나가서 택시를 부르고 운전사에게 샌프란시스코에있는 이곳으로 데려다달라고합니다. 옷을 세탁하고 택시로 돌아와 여기로 돌아옵니다. 깨끗한 옷을 주면서“여기 깨끗한 옷이 있습니다.”라고 말합니다.

내가 어떻게했는지 모를 겁니다. 세탁소에 대한 지식이 없습니다. 프랑스어를 할 수 있고 택시를 잡을 수도 없습니다. 돈을 지불 할 수없고 주머니에 달러도 없습니다. 그러나 나는 그 모든 것을하는 방법을 알고 있었다. 그리고 당신은 그것에 대해 알 필요가 없었습니다. 그 모든 복잡성이 내 안에 숨겨져 있었고 우리는 매우 높은 수준의 추상화에서 상호 작용할 수있었습니다. 그것이 바로 물체입니다. 그것들은 복잡성을 캡슐화하고 그 복잡성에 대한 인터페이스는 높은 수준입니다.

아키 타입

실제 시나리오를 코드로 표현하는 능력 라코 디스

- 라코 디스

이유

이 내용을 더 쉽게 이해할 수 있도록합니다.우리 머릿속에서 더 잘 이해할 수 있으며 올바르게 구현하면 코드가 더 효율적이고 재사용 가능하며 반복이 줄어 듭니다.

이를 수행하려면 다음이 필요합니다.

  • 포인터 / 참조 를 통해 this== this and this!= that.
  • 데이터를 저장하는 (예 : Arm)을 가리키는 클래스 (예 : Arm) 및 작업 (Throw (IThrowable))
  • 다형성 (상속 및 / 또는 인터페이스) : 특정 개체를 일반적인 방식으로 처리하여 책과 벽에 낙서를 읽을 수 있습니다 (둘 다 IReadable 구현)
  • 캡슐화 사과는 Atoms [] 속성을 노출하지 않기 때문입니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top