명사, 동사, 형용사를 쓰는 것은 훌륭한 접근 방법이지만, 클래스 디자인은 어떤 데이터를 숨겨야하는지 질문하는 것으로 생각하고 싶습니다.
Query
객체와 객체 가 있다고 상상해보십시오 Database
.
이 Query
함수는 쿼리를 작성하고 저장하는 데 도움이됩니다. 함수는 함수를 사용하여 쿼리를 쉽게 작성할 수 있으므로 여기에서 핵심입니다. 어쩌면 당신은 머물 수 있습니다 : Query().select('Country').from_table('User').where('Country == "Brazil"')
. 구문은 중요하지 않습니다. 바로 그 일입니다! -열쇠는 객체가 무언가 를 숨기는 것을 돕는 것 입니다.이 경우 쿼리를 저장하고 출력하는 데 필요한 데이터입니다. 객체의 힘은 객체를 사용하는 구문 (이 경우에는 영리한 체인)에서 작동하며 객체를 저장하기 위해 저장할 필요가 없습니다. 제대로 완료되면Query
개체가 둘 이상의 데이터베이스에 대한 쿼리를 출력 할 수 있습니다. 내부적으로 특정 형식을 저장하지만 출력 할 때 다른 형식으로 쉽게 변환 할 수 있습니다 (Postgres, MySQL, MongoDB).
이제 Database
객체를 생각해 봅시다 . 이것은 무엇을 숨기고 저장합니까? 데이터베이스의 전체 내용을 저장할 수는 없습니다. 데이터베이스가 있기 때문입니다! 그래서 요점이 뭐야? 목표는 오브젝트 를 사용하는 사람들로부터 데이터베이스가 작동하는 방식 을 숨기는 것입니다 Database
. 좋은 클래스는 내부 상태를 조작 할 때 추론을 단순화합니다. 이를 위해Database
개체의 경우 네트워킹 호출 작동 방식을 숨기거나 쿼리 또는 업데이트를 일괄 처리하거나 캐싱 계층을 제공 할 수 있습니다.
문제는이 Database
개체가 거대하다는 것입니다. 데이터베이스에 액세스하는 방법을 나타내므로 표지 아래에서 모든 작업을 수행 할 수 있습니다. 분명한 네트워킹, 캐싱 및 일괄 처리는 시스템에 따라 처리하기가 매우 어렵 기 때문에 숨기는 것이 매우 유용합니다. 그러나 많은 사람들이 알다시피 데이터베이스는 매우 복잡하며 원시 DB 호출에서 멀어 질수록 성능을 조정하고 일이 어떻게 작동하는지 이해하는 것이 더 어렵습니다.
이것이 OOP의 기본적인 균형입니다. 올바른 추상화를 선택하면 코딩이 간단 해집니다 (문자열, 배열, 사전). 너무 큰 추상화 (데이터베이스, EmailManager, NetworkingManager)를 선택하면 작동 방식 또는 수행 할 작업을 실제로 이해하기에는 너무 복잡해질 수 있습니다. 배고 있다. 목표는 복잡성 을 숨기는 것이지만 약간의 복잡성이 필요합니다. 경험상 가장 좋은 방법은 Manager
객체 를 피하고 대신 클래스 structs
를 만드는 것입니다. 데이터를 보유하고 조작하는 데 도움이되는 도우미 메서드를 사용하여 데이터를 보유하는 것만으로도 편리합니다. 예를 들어, 경우에 EmailManager
함수 호출로 시작 sendEmail
하는이 얻어 Email
개체. 이것은 간단한 시작점이며 코드는 이해하기 매우 쉽습니다.
예를 들어, 원하는 것을 계산하기 위해 어떤 데이터가 함께 있어야하는지 생각해보십시오. 예를 들어, 동물이 얼마나 멀리 걷는 지 알고 싶을 경우 AnimalStep
및 AnimalTrip
(AnimalSteps 모음) 클래스를 가질 수 있습니다 . 이제 각 여행에 모든 단계 데이터가 있으므로 이에 대한 정보를 알아낼 수 있어야합니다 AnimalTrip.calculateDistance()
.