객체 지향 언어 (Java)를 사용하기 시작했을 때, 나는 거의 “Cool”으로 가서 코딩을 시작했습니다. OOP에 대한 많은 질문을 읽은 후에야 최근까지만 생각해 본 적이 없습니다. 내가 얻는 일반적인 인상은 사람들이 어려움을 겪고 있다는 것입니다. 나는 그것을 어렵게 생각하지 않았고 어떤 천재라고도 말하지 않았기 때문에 무언가를 놓치거나 오해했을 것이라고 생각합니다.
OOP를 이해하기 어려운 이유는 무엇입니까? 인가 가 이해하기 어려운?
답변
개인적으로 OOP의 역학을 이해하기가 상당히 쉽다는 것을 알았습니다. 나를위한 어려운 부분은 그것의 “왜”였습니다. 내가 처음 노출되었을 때 문제를 찾는 해결책처럼 보였습니다. 대부분의 사람들이 어려움을 겪고 있다고 생각하는 이유는 다음과 같습니다.
-
처음부터 OO를 가르치는 IMHO는 끔찍한 생각입니다. 절차 적 코딩은 “나쁜 습관”이 아니며 일부 작업에 적합한 도구입니다. OO 프로그램의 개별 메소드는 어쨌든 절차 상으로 보이는 경향이 있습니다. 더욱이, 절차 적 프로그래밍을 잘 배우기 전에 한계가 드러나기 전에, OO는 학생에게 그다지 유용하지 않은 것 같습니다.
-
OO를 실제로 파악하기 전에 데이터 구조의 기본 사항과 후기 바인딩 / 고차 함수를 알아야합니다. 프리미티브를 사용하고 고차 함수를 전달하는 대신 데이터 구조화 개념을 이해하지 못하면 다형성 (기본적으로 데이터에 대한 포인터와 데이터에서 작동하는 많은 함수를 전달 함)을 파악하기가 어렵습니다. 함수를 가리키는 포인터.
-
디자인 패턴은 좀 더 발전된 것이 아니라 OO의 기본으로 가르쳐야합니다. 디자인 패턴을 사용하면 나무를 통해 숲을 볼 수 있으며 OO가 실제 문제를 단순화 할 수있는 위치에 대한 구체적인 예를 제공 할 수 있으며 결국에는이를 배우고 싶을 것입니다. 또한 일단 OO를 얻으면 대부분의 디자인 패턴이 뒤늦게 분명해집니다.
답변
아직 언급되지 않은 몇 가지 요소가 있다고 생각합니다.
우선 모든 것이 대상인 “순수한 OOP”(예 : 스몰 토크)에서 숫자를 하나의 지능적인 대상으로 생각하기 위해 마음을 다소 부 자연스러운 구성으로 바꿔야합니다. 실제로는 가치 일 뿐이므로 21
실제로 는 가치 일뿐입니다. 이는 OOP의 큰 장점이 현실을 더욱 밀접하게 모델링한다고 들었을 때 특히 문제가됩니다. 현실.
둘째, OOP의 상속은 대부분의 사람들의 정신 모델을 따르지 않습니다. 대부분의 사람들에게 가장 구체적으로 분류하는 것은 작동하는 클래스 계층을 만드는 데 필요한 절대 규칙에 가까운 곳 이 없습니다 . 특히, class D
다른 class B
것을 상속받는 것을 만드는 것은 class D
공유 객체가의 모든 특성을 긍정적 으로 공유 한다는 것을 의미합니다 class B
. class D
새롭고 다양한 특성을 추가 할 수 있지만 모든 특성은 class B
그대로 유지해야합니다.
반면에 사람들이 사물을 정신적으로 분류 할 때는 일반적으로 훨씬 느슨한 모델을 따릅니다. 예를 들어, 사람이 객체 클래스를 구성하는 것에 대한 규칙을 만들면 다른 규칙을 충분히 따르는 한 거의 모든 규칙을 위반할 수 있습니다. 실제로 깨질 수없는 몇 가지 규칙조차도 거의 항상 “스트레치”될 수 있습니다.
예를 들어, “car”를 클래스로 고려하십시오. 그것은 있는지 아주 쉽게 광대 한 대부분의 사람들은 “차”로 생각하는 것의 대부분은 네 개의 바퀴가 있습니다. 그러나 대부분의 사람들은 바퀴가 3 개인 자동차를 보았습니다 (적어도 그림). 올바른 나이의 우리 중 몇몇은 또한 6 개의 바퀴가 달린 80 년대 초반의 경주 용 자동차를 기억합니다. 이것은 기본적으로 우리에게 세 가지 선택을 남깁니다.
- 자동차에 몇 개의 바퀴가 있는지에 대해서는 아무 것도 주장하지 마십시오. 그러나 이것은 항상 4가 될 것이라는 암시 적 가정과 다른 숫자로 인해 깨질 수있는 코드로 이어질 수 있습니다.
- 모든 자동차에는 4 개의 바퀴가 있으며, 실제로는 알고 있지만 다른 자동차를 “차가 아닌”것으로 분류하십시오.
- 만일의 경우에도이 기능이 절대로 필요하지 않거나, 사용되거나, 제대로 테스트되지 않을 경우를 대비하여, 휠 수의 변화를 허용하도록 클래스를 설계하십시오.
OOP에 대한 교육은 종종 거대한 분류 체계를 구축하는 데 중점을 둡니다. 예를 들어 지구상의 모든 알려진 생명체의 거대한 계층 구조 또는 그 순서에 대한 거대한 계층 구조의 조각과 조각. 이로 인해 두 가지 문제가 발생합니다. 무엇보다 많은 사람들이 당면한 질문과 전혀 관련이없는 방대한 양의 정보에 집중하는 경향이 있습니다. 어느 시점에서 나는 개 품종을 모델링하는 방법과 (예를 들어) “미니어처 푸들”이 “풀 사이즈 푸들”에서 상속되어야하는지 또는 그 반대인지, 추상적 기반 “푸들”이 있어야하는지에 대해 다소 긴 토론을 보았습니다. “클래스 푸들”과 “미니어처 푸들”이 모두 포함 된 클래스. 그들이 모두 무시한 것처럼 보이는 것은 응용 프로그램이 개에 대한 라이센스를 추적해야한다는 것입니다.
둘째, 그리고 가장 중요한 것은 현재 작업에 중요한 특성에 중점을 두지 않고 항목의 특성에 중점을 둡니다. 실제로 필요한 부분을 모델링하는 데 중점을두고 있으며, 실제로 필요한 부분은 우리의 요구를 충족시킬 가장 간단한 모델을 구축하고 추상화를 사용하여 필요한 하위 클래스에 맞게 생성하여 추상화에 맞 춥니 다.
마지막으로 다시 한 번 말씀 드리겠습니다. 우리는 수년에 걸쳐 데이터베이스와 동일한 경로를 천천히 따르고 있습니다. 초기 데이터베이스는 계층 적 모델을 따랐습니다. 데이터에만 초점을 맞추는 것 외에 이것은 단일 상속입니다. 짧은 시간 동안, 몇 개의 데이터베이스가 네트워크 모델을 따랐습니다. 본질적으로 다중 상속과 동일합니다 (이 각도에서 볼 때, 여러 인터페이스는 여러 기본 클래스와 충분히 다르거 나주의를 기울여야합니다).
그러나 오래 전에 데이터베이스는 대부분 관계형 모델에 수렴되었습니다 (그리고 SQL이 아니더라도이 추상화 수준에서 현재 “NoSQL”데이터베이스도 관계형입니다). 관계형 모델의 장점은 여기서 반복하지 않을 것이라는 충분히 잘 알려져 있습니다. 우리가 프로그래밍 할 때 가장 가까운 관계형 모델의 아날로그는 일반 프로그래밍입니다 (죄송하지만 이름에도 불구하고 Java generics는 예를 들어 실제로 작은 단계이지만 자격이 없습니다) 올바른 방향으로).
답변
OOP는 추상적 사고 능력이 필요합니다. 전문 프로그래머조차도 거의 가지고 있지 않은 선물 / 저주.
답변
다음과 같이 기본적인 어려움을 요약 할 수 있다고 생각합니다.
// The way most people think.
Operation - object - parameters
// Example:
Turn the car left.
// The way OOP works conceptually
Object - operation - parameters
// Example:
Car.Turn(270);
물론, 사람들은 “왼쪽”을 270으로 매핑하는 데 익숙 할 수 있으며, “차를 돌리는”대신 “Car.Turn”이라고 말하는 것은 큰 도약이 아닙니다. 그러나 이러한 객체를 잘 처리하고 만들려면 일반적으로 생각하는 방식을 뒤집어 야합니다.
객체를 조작하는 대신 객체가 실제로 자체적으로 작업하도록 지시합니다. 더 이상 어렵지 않을지 모르지만 창을 열도록 지시하면 이상하게 들립니다. 이런 사고 방식에 익숙하지 않은 사람들은 결국 자연스러워 질 때까지 반복해서 그 이상 함과 싸워야합니다.
답변
모든 패러다임은 대부분의 사람들이 파악하기 위해 “가장자리를 넘어서”는 특정 추진을 요구합니다. 정의에 따르면, 그것은 새로운 사고 방식이므로, 오래된 개념을 포기하고 새로운 개념이 유용한 이유를 완전히 파악해야합니다.
컴퓨터 프로그래밍을 가르치는 데 사용되는 방법이 일반적으로 매우 열악하다는 것이 많은 문제라고 생각합니다. OOP는 너무 일반적이므로 눈에 띄지 않지만 함수형 프로그래밍에서는 여전히 흔합니다.
-
중요한 개념은 홀수 이름 뒤에 숨겨져 있습니다 (FP : 모나드 란 무엇입니까? OOP : 왜 그것들을 때때로 함수라고 부르고 다른 방법으로 부르는 이유는 무엇입니까?)
-
이상한 개념은 실제로하는 일이나 왜 그것을 사용하는지 또는 왜 그것을 사용하려고 생각했는지에 대한 비유로 설명되어 있습니다 (FP : 모나드는 우주복이며 일부 코드를 마무리합니다). 개체는 오리와 같으며 소음을 내고 걸을 수 있으며 동물에서 상속됩니다.)
-
좋은 물건은 사람마다 다르므로 어떤 학생에게 어떤 전환점이 될지 명확하지 않으며 종종 교사가 기억조차 할 수 없습니다. (FP : 오, 모나드는 매번 일어나는 일을 명시 적으로 기록하지 않고도 유형 자체에서 무언가를 숨기고 계속 수행 할 수있게합니다. OOP : 오, 객체를 사용하면 해당 데이터와 함께 일종의 데이터에 대한 기능을 유지할 수 있습니다.)
가장 나쁜 점은 질문에서 알 수 있듯이 어떤 사람들은 개념이 좋은 이유를 즉시 이해하고 어떤 사람들은 그렇지 않을 것이라는 점을 즉시 이해하게 될 것입니다. 실제로 티핑 포인트가 무엇인지에 달려 있습니다. 나에게있어 객체가 데이터를 저장하고 그 데이터에 대한 방법을 결정하는 것이 핵심이었다. 그런 다음 객체의 메소드 호출이 해당 객체를 첫 번째 매개 변수로 정적 호출하는 것과 매우 유사하다는 것을 깨닫는 것처럼 나중에 뛰어 들었습니다.
나중에 약간의 점프는 이해를 다듬는 데 도움이되지만, “OOP는 말이되지 않습니다. 왜 사람들은 이것을 하는가?” “OOP가 최고입니다. 왜 사람들이 다른 일을합니까?”
답변
OOP에 대한 기본 설명은 현장에서 사용되는 방식과 거의 관련이 없습니다. 이를 가르치기위한 대부분의 프로그램은 “차를 물체로 생각하고 바퀴를 물체로, 문과 변속기 …”와 같은 실제 모델을 사용하려고하지만 모호한 시뮬레이션 프로그래밍의 경우를 제외하고, 객체는 비 물리적 개념을 나타내거나 간접적 인 것을 소개하는 데 훨씬 더 자주 사용됩니다. 그 결과 사람들이 직관적으로 잘못 이해하게됩니다.
설계 패턴에서 가르치는 것은 OOP를 설명하는 훨씬 더 좋은 방법입니다. 프로그래머에게 추상적으로 설명하기보다는 실제 모델링 문제가 어떻게 객체를 효과적으로 공격 할 수 있는지 보여줍니다.
답변
나는 dsimcha의 대답에 대부분 동의하지 않습니다.
-
처음부터 OO를 가르치는 것은 그 자체로 나쁜 생각이 아니며 절차 언어를 가르치는 것도 아닙니다. 중요한 것은 OO 나 절차에 관계없이 사람들에게 명확하고 간결하며 응집력있는 코드를 작성하도록 가르치는 것입니다.
-
좋은 OO 프로그램의 개별적인 방법은 전혀 절차적인 경향이 없습니다. 이것은 OO 언어의 진화 (내가 아는 유일한 다른 OO 언어 인 C ++ 이외의 C ++이기 때문에 C # 읽기)와 하루가 점점 복잡 해지는 구문 (람다, LINQ to 객체 등)으로 점점 더 진실 해지고 있습니다. 절차 적 언어에서 OO 방법과 절차의 유일한 유사점은 각각의 선형 적 특성이며, 곧 변경 될 것으로 의심됩니다.
-
데이터 구조를 이해하지 않으면 절차 언어를 마스터 할 수 없습니다. 포인터 개념은 OO 언어와 마찬가지로 절차 언어에 중요합니다. 예를 들어 절차 언어에서 일반적으로 사용되는 매개 변수를 참조로 전달하면 OO 언어를 배우는 데 필요한만큼 포인터를 이해해야합니다.
-
디자인 패턴은 OO 프로그래밍의 기본이 아니기 때문에 OO 프로그래밍 초기에 전혀 가르쳐서는 안된다고 생각합니다. 디자인 패턴에 대해 전혀 몰라도 확실히 좋은 OO 프로그래머가 될 수 있습니다. 사실, 사람은 적절한 이름으로 문서화되어 있고 그에 관한 책이 쓰여져 있다는 것을 알지 않고도 잘 알려진 디자인 패턴을 사용할 수 있습니다. 기본적으로 배워야 할 것은 단일 책임, 공개 폐쇄 및 인터페이스 분리와 같은 설계 원칙입니다. 불행히도 요즘 OO 프로그래머라고 생각하는 많은 사람들은이 기본 개념에 익숙하지 않거나 무시하려고 선택하기 때문에 많은 쓰레기 OO 코드가 있습니다.
원래 포스터의 질문에 대답하기 위해 OO는 절차 적 프로그래밍보다 이해하기 어려운 개념입니다. 우리는 실제 객체의 속성과 방법으로 생각하지 않기 때문입니다. 예를 들어, 인간의 두뇌는 “TurnOn”을 TV의 방법으로 쉽게 생각하지 않지만 사람이 TV를 켜는 기능으로 간주합니다. 유사하게, 다형성은 일반적으로 하나의 “얼굴”에 의해 각각의 실제 객체를 보는 인간 두뇌에 대한 외래 개념이다. 상속은 다시 우리의 뇌에 자연스럽지 않습니다. 내가 개발자라고해서 내 아들이 하나라는 뜻은 아닙니다. 일반적으로, 인간의 두뇌는 OO를 배우도록 훈련을 받아야하지만 절차 적 언어는 더 자연 스럽습니다.