OO 언어는 때때로 기계와 직접 인터페이스하기 위해 저수준 언어 대신 사용될 수 있습니다. C ++ 물론 C #의 경우에도 어댑터 등이 있습니다. 기계 부품을 제어하고 메모리를 미세하게 제어하기위한 코드 작성은 가능한 한 낮은 수준에 가깝게 유지하는 것이 가장 좋습니다. 그러나이 질문이 Line Of Business, 웹 응용 프로그램, IOT, 웹 서비스 및 대부분의 대량 사용 응용 프로그램과 같은 현재 객체 지향 소프트웨어와 관련이 있다면 ...
해당되는 경우 답변
독자는 SOA (Service-Oriented Architecture)로 작업을 시도 할 수 있습니다. 즉, DDD, N-Layered, N-Tiered, Hexagonal 등입니다. 지난 10 년 동안 70 년대와 80 년대에 설명 된대로 대기업 응용 프로그램에서 "전통적인"OO (Active-Record 또는 Rich-Models)를 효율적으로 사용하는 것을 보지 못했습니다. (참고 1 참조)
결함은 OP와 관련이 없지만 질문에는 몇 가지 문제가 있습니다.
제공하는 예제는 단순히 다형성을 보여주기위한 것이며 프로덕션 코드가 아닙니다. 때로는 정확히 같은 예가 문자 그대로 사용됩니다.
FP 및 SOA에서 데이터는 Business Logic과 분리됩니다. 즉, 데이터와 논리는 함께 가지 않습니다. 논리는 서비스로 들어가고 데이터 (도메인 모델)에는 다형성 동작이 없습니다 (주 2 참조).
서비스 및 기능은 다형성 일 수 있습니다. FP에서는 함수를 매개 변수로 값 대신 다른 함수에 자주 전달합니다. Callable 또는 Func와 같은 유형의 OO 언어에서 동일한 작업을 수행 할 수 있지만 만연하지는 않습니다 (주 3 참조). FP 및 SOA에서 모델은 다형성이 아니며 서비스 / 기능 만 있습니다. (주 4 참조)
이 예에서는 하드 코딩이 잘못되었습니다. 나는 붉은 색 끈 "개 껍질"에 대해서만 말하는 것이 아닙니다. CatModel과 DogModel 자체에 대해서도 이야기하고 있습니다. 양을 추가하려고하면 어떻게됩니까? 코드에 들어가서 새 코드를 만들어야합니까? 왜? 프로덕션 코드에서는 속성이있는 AnimalModel 만 보입니다. 최악의 경우, AmphibianModel과 FowlModel의 속성과 처리가 너무 다른 경우.
이것이 현재 "OO"언어로 예상되는 것입니다.
public class Animal
{
public int AnimalID { get; set; }
public int LegCount { get; set; }
public string Name { get; set; }
public string WhatISay { get; set; }
}
public class AnimalService : IManageAnimals
{
private IPersistAnimals _animalRepo;
public AnimalService(IPersistAnimals animalRepo) { _animalRepo = animalRepo; }
public List<Animal> GetAnimals() => _animalRepo.GetAnimals();
public string WhatDoISay(Animal animal)
{
if (!string.IsNullOrWhiteSpace(animal.WhatISay))
return animal.WhatISay;
return _animalRepo.GetAnimalNoise(animal.AnimalID);
}
}
OO의 클래스에서 함수형 프로그래밍으로 어떻게 이동합니까? 다른 사람들이 말했듯이; 가능하지만 실제로는 그렇지 않습니다. 위의 요점은 Java 및 C #을 수행 할 때 (전세계적인 의미에서) 클래스를 사용하지 않아야 함을 보여줍니다. 서비스 지향 아키텍처 (DDD, 계층화, 계층화, 6 각형 등)로 코드를 작성하면 데이터 (도메인 모델)와 논리 함수 (서비스)를 분리하므로 기능에 한 걸음 더 다가 갈 수 있습니다.
OO FP에 한 단계 더 가까운 언어
좀 더 나아가 SOA 서비스를 두 가지 유형으로 나눌 수도 있습니다.
선택적인 수업 유형 1 : 진입 점에 대한 공통 인터페이스 구현 서비스. 이것들은 "순수"또는 "불완전"다른 기능을 호출 할 수있는 "불완전한"진입 점입니다. RESTful API의 진입 점이 될 수 있습니다.
선택적인 클래스 유형 2 : Pure Business Logic Services. 이것들은 "순수한"기능을 가진 정적 클래스입니다. FP에서 "순수"는 부작용이 없음을 의미합니다. 명시 적으로 상태 또는 지속성을 설정하지 않습니다. (주 5 참조)
따라서 서비스 지향 아키텍처에서 사용되는 객체 지향 언어의 클래스를 생각하면 OO 코드에 도움이 될뿐만 아니라 기능 프로그래밍을 이해하기 쉽게 보이게됩니다.
노트
참고 1 : 원본 "Rich"또는 "Active-Record"객체 지향 디자인은 여전히 사용 중입니다. 사람들이 10 년 이상 전에 "올바른 일을했을 때"와 같은 많은 레거시 코드가 있습니다. 지난번에 C ++의 비디오 게임 Codebase에서 메모리가 정확하게 제어되고 공간이 매우 제한적인 코드를 보았습니다. 말할 것도없이 FP와 서비스 지향 아키텍처 (Service-Oriented Architectures)는 야수이며 하드웨어를 고려해서는 안됩니다. 그러나 그들은 끊임없이 변화하고, 유지되고, 가변적 인 데이터 크기를 가지고 있으며, 다른 측면들을 우선 순위로두고 있습니다. 비디오 게임 및 머신 AI에서는 신호와 데이터를 매우 정확하게 제어합니다.
참고 2 : 도메인 모델에는 다형성 동작이나 외부 종속성이 없습니다. 그들은 "절연"입니다. 그렇다고 100 % 빈혈 상태 여야한다는 의미는 아닙니다. 해당되는 경우 구성 및 변경 가능한 속성 변경과 관련하여 많은 논리를 가질 수 있습니다. Eric Evans와 Mark Seemann의 DDD "값 개체"및 엔터티를 참조하십시오.
참고 3 : Linq와 Lambda는 매우 일반적입니다. 그러나 사용자가 새 함수를 만들 때 Func 또는 Callable을 매개 변수로 사용하는 경우는 거의 없지만 FP에서는 해당 패턴을 따르는 함수가없는 앱을 보는 것이 이상합니다.
참고 4 : 다형성과 상속을 혼동하지 마십시오. CatModel은 AnimalBase를 상속하여 동물이 일반적으로 가지고있는 속성을 결정할 수 있습니다. 그러나 내가 보여주는 것처럼, 이와 같은 모델은 코드 냄새 입니다. 이 패턴이 표시되면이를 분해하여 데이터로 전환하는 것을 고려할 수 있습니다.
참고 5 : 순수 함수는 함수를 매개 변수로 사용할 수 있습니다. 들어오는 기능은 불완전하지만 순수 할 수 있습니다. 테스트 목적으로 항상 순수합니다. 그러나 프로덕션 환경에서는 순수하게 취급되지만 부작용이있을 수 있습니다. 순수한 기능이 순수하다는 사실은 변하지 않습니다. 매개 변수 기능이 불완전 할 수 있지만. 혼란스럽지 않습니다! :디