블로그에서 명령형 및 함수형 프로그래밍에 익숙하고 객체 지향 프로그래밍에 관련된 기본 개념에 익숙한 것 같지만 실제로 "클릭"한 적이 없었습니다. 유용하게 만듭니다. 나는 그 지식의 관점에서 설명하려고 노력할 것이고 그것이 당신에게 도움이되기를 바랍니다.
핵심적으로 OOP는 명령형 패러다임을 사용하여 문제 영역을 모델링하는 "스마트 한"데이터 구조를 만들어 고도의 복잡성을보다 효과적으로 관리하는 방법입니다. (표준 절차 비 객체 지향) 프로그램에는 변수와 변수와 관련이있는 코드라는 두 가지 기본 사항이 있습니다. 이 코드는 사용자 및 다양한 소스로부터 입력을 받아 변수에 저장하고 조작하며 사용자 또는 다양한 다른 위치로가는 출력 데이터를 생성합니다.
객체 지향 프로그래밍은 기본 패턴을 취하고 더 작은 규모로 반복하여 프로그램을 단순화하는 방법입니다. 프로그램이 코드로 수행 할 작업을 알고있는 코드가있는 대량의 데이터 모음 인 것처럼 각 개체는 코드로 수행 할 작업을 알고있는 코드에 바인딩 된 작은 데이터 조각입니다.
문제 영역을 작은 조각으로 나누고 가능한 많은 양의 데이터를 처리 할 수있는 코드에 직접 바인딩함으로써 프로세스 전체와 하위 프로세스에 대해 추론하기가 훨씬 쉬워집니다. 프로세스를 구성하는 문제.
데이터를 객체 클래스로 그룹화하면 해당 데이터와 관련된 코드를 중앙 집중화하여 관련 코드를보다 쉽게 찾고 디버깅 할 수 있습니다. 또한 액세스 지정자 뒤에있는 데이터를 캡슐화하고 메소드 (또는 언어가 지원하는 경우 특성)를 통해서만 액세스하면 데이터 손상 또는 불변의 위반 가능성이 크게 줄어 듭니다.
상속과 다형성을 사용하여 기존 클래스를 재사용하고 원본을 수정하거나 처음부터 모든 것을 다시 작성할 필요없이 특정 요구에 맞게 사용자 정의 할 수 있습니다. ( 피할 수 없다면 절대하지 말아야 할 일 이다 .) 기본 객체를 이해하면 킬러 캥거루가 될 수있다 .
나에게 이것은 객체 지향 프로그래밍의 기본 원칙입니다. 복잡성 관리, 코드 중앙 집중화 및 객체 클래스 생성을 통한 문제 도메인 모델링, 상속 및 다형성, 캡슐화 및 속성. 이것이 많은 프로그래머가 왜 유용한 지 이해하는 데 도움이되기를 바랍니다.
편집 : 의견에서 Joel의 질문에 대한 답변으로,
명령형 프로그램과 근본적으로 다른 "개체 지향 프로그램"에 포함 된 내용 (설명한 멋진 정의 제외)을 설명 할 수 있습니까? "공 구르는 방법은?"
여기에 약간의 면책 조항이 있습니다. "객체 지향 프로그램"의 내 모델은 기본적으로 델파이 모델이며, 이전 델파이 팀 멤버가 만든 C # /. NET 모델과 매우 유사합니다. 내가 여기서 말하는 것은 다른 OO 언어에서는 적용되지 않거나 많이 적용되지 않을 수 있습니다.
객체 지향 프로그램은 모든 논리가 객체를 중심으로 구성되는 프로그램입니다. 물론 이것은 어딘가에 부트 스트랩되어야합니다. 일반적인 Delphi 프로그램에는이라는 단일 객체를 생성하는 초기화 코드가 포함되어 있습니다 Application
. 프로그램을 시작할 때을 호출 Application.Initialize
한 다음 Application.CreateForm
처음부터 메모리에로드하려는 모든 양식을 호출 한 다음 Application.Run,
화면에 기본 양식을 표시하고 핵심 구성 요소 인 입력 / 이벤트 루프를 시작합니다. 대화 형 컴퓨터 프로그램.
응용 프로그램과 폼은 OS에서 들어오는 이벤트를 폴링하여 개체의 메서드 호출로 변환합니다. 매우 일반적인 한 가지는 이벤트 처리기 또는 .NET에서 "대리인"을 사용하는 것입니다. 객체에는 "X와 Y를 수행하지만이 특정 이벤트 핸들러가 할당되어 있는지 확인하고있는 경우 호출하십시오"라는 메소드가 있습니다. 이벤트 핸들러는 객체의 동작을 확장하는 데 사용되는 메소드 포인터 (메소드에 대한 참조와 객체 인스턴스에 대한 참조를 포함하는 매우 간단한 클로저)입니다. 예를 들어 양식에 버튼 객체가있는 경우 버튼을 클릭 할 때 다른 객체가 메소드를 실행하게하는 OnClick 이벤트 핸들러를 연결하여 해당 동작을 사용자 정의합니다.
따라서 객체 지향 프로그램에서 대부분의 작업은 특정 책임을 가진 객체를 정의하고 메소드 포인터를 통해 또는 한 객체가 다른 객체의 공용 인터페이스에 정의 된 메소드를 직접 호출하여 연결함으로써 수행됩니다. (그리고 이제 우리는 캡슐화로 돌아 왔습니다.) 이것은 대학에서 OOP 수업을 받기 전에는 다시는 개념이 없었습니다.