OOP 는 시스템의 동작을 모델링 하는 것으로 생각할 수 있습니다 . 실제 은유가 때때로 유용 할 수 있지만 (예 : "파이프 라인", "공장"등) 시스템 은 '실제 세계'에 존재할 필요 는 없습니다 .
우리가 원하는 시스템이 한 번에 모델링하기에 너무 복잡한 경우, 작은 조각으로 나눠서 "문제 도메인"을 모델링 할 수 있습니다. 이러한 문제는 더 이상 분해 될 수 있으며 행동이 일치하는 조각에 도달 할 때까지 계속됩니다 숫자, 문자열, 목록 등과 같은 내장 언어 객체의 객체입니다.
일단 우리가 그 간단한 조각들을 가지고 나면, 더 큰 조각들의 행동을 설명하기 위해 그것들을 함께 결합 할 수 있습니다. 우리는 더 큰 조각들로 결합 할 수 있습니다. 체계.
우리가 몇몇 클래스를 작성할 수있는 것은이 "결합"단계입니다. 원하는 방식으로 작동하는 기존 객체가 없을 때 클래스를 작성합니다. 예를 들어, 도메인에는 "foos", "bars"라는 foo 모음 및 "bazs"라는 모음 모음이 포함될 수 있습니다. 우리는 foo가 문자열로 모델링하기에 충분히 간단하다는 것을 알 수 있습니다. 우리는 막대가 내용이 파이썬이 제공하는 것과 일치하지 않는 특정 제약 조건을 준수해야한다는 것을 알았습니다.이 경우이 제약 조건을 적용하기 위해 새 클래스를 작성할 수 있습니다. 아마도 baz는 그러한 특성이 없으므로 목록으로 나타낼 수 있습니다.
우리가주의 할 수 이러한 구성 요소 (FOOS, 바, bazs)의 모든 사람을위한 새로운 클래스를 작성,하지만 우리는하지 않습니다 필요가 이미 올바른 동작 뭔가있을 경우에. 특히, 클래스에 대해 뭔가를 '제공'할 필요가 유용하다는 것을 우리는 사용자 정의 클래스의 많은 레이어가 그렇게해도 (데이터, 방법, 상수, 서브 클래스 등) 해야한다 결국 사용을 일부 내장 기능; 예를 들어, foos에 대한 새로운 클래스를 작성했다면 아마도 문자열 만 포함하고있을 것입니다. foo 클래스를 잊어 버리고 bar 클래스에 대신 해당 문자열을 포함 시키십시오. 클래스는 내장 객체이며 특히 융통성이 있습니다.
일단 우리가 도메인 모델을 가지고 나면, 우리는 그 조각들의 특정 인스턴스 를 가져 와서 우리가 모델링하고자하는 특정 시스템의 "시뮬레이션"으로 배열 할 수 있습니다 (예 : "기계 학습 시스템 ...").
일단 우리가이 시뮬레이션을 가지고 나면, 우리는 그것을 실행할 수 있고, 그리고 presto, 우리는 ... (또는 우리가 모델링하고있는 다른 것)을위한 작동하는 머신 러닝 시스템을 갖게됩니다.
이제 특정 상황에서 "피처 추출기"구성 요소의 동작을 모델링하려고합니다. 문제는 "기능 추출기"처럼 동작하는 내장 객체가 있습니까, 아니면 더 간단한 것으로 분리해야합니까? 피처 추출기는 함수 객체와 매우 유사하게 작동하므로 모델로 사용하는 것이 좋습니다.
이러한 종류의 개념에 대해 배울 때 명심해야 할 것은 언어마다 다른 내장 기능과 객체를 제공 할 수 있다는 것입니다 (물론 "개체"와 같은 용어도 사용하지 않습니다!) 따라서 한 언어에서 의미가있는 솔루션은 다른 언어에서는 그다지 유용하지 않을 수 있습니다 (이는 같은 언어의 다른 버전에도 적용될 수 있습니다!).
역사적으로, 많은 OOP 문헌 (특히 "디자인 패턴")은 파이썬과는 다른 Java에 중점을두고 있습니다. 예를 들어 Java 클래스는 객체가 아니며 Java는 최근까지 함수 객체가 없었습니다 .Java는 엄격한 유형 검사 (인터페이스 및 하위 클래스를 장려합니다)하면서 Python은 오리 타이핑을 장려하고 Java에는 모듈 객체가 없습니다 .Java 정수 / 수레 / 등. 객체가 아니고 Java의 메타 프로그래밍 / 내부 검사에는 "반사"가 필요합니다.
나는 Java를 선택하려고하지 않고 (또 다른 예로서, 많은 OOP 이론이 Smalltalk에 관한 것인데, 파이썬과는 매우 다릅니다) 문맥에 대해 매우 신중하게 생각해야한다는 것을 지적하려고합니다. 솔루션이 개발 된 제약 조건과 현재 상황과 일치하는지 여부
귀하의 경우 함수 객체는 좋은 선택처럼 보입니다. 왜 "모범 사례"가이드 라인이 함수 객체를 가능한 해결책으로 언급하지 않는지 궁금하다면, 그 가이드 라인이 이전 버전의 Java 용으로 작성 되었기 때문일 수 있습니다!