저는 SOLID 설계 원칙에 익숙하지 않습니다 . 나는 그들의 원인과 이점을 이해하지만 SOLID 원칙을 사용하기위한 실제 연습으로 리팩토링하려는 더 작은 프로젝트에는 적용하지 않습니다. 완벽하게 작동하는 응용 프로그램을 변경할 필요는 없지만 어쨌든 리팩터링하여 향후 프로젝트의 디자인 경험을 얻고 싶습니다.
응용 프로그램에는 다음과 같은 작업이 있습니다 (실제로는 그 이상이지만 간단하게 유지하십시오). 데이터베이스 테이블 / 열 /보기 등 정의가 포함 된 XML 파일을 읽고 작성하기 위해 사용할 수있는 SQL 파일을 만들어야합니다 ORACLE 데이터베이스 스키마
(참고 : 왜 필요한지 또는 왜 XSLT 등을 사용하지 않는지에 대한 논의는 자제하십시오. 이유는 있지만 주제가 맞지 않습니다.)
처음에는 테이블과 제약 조건 만 보도록 선택했습니다. 열을 무시하면 다음과 같이 말할 수 있습니다.
제약 조건은 테이블의 일부 (또는 CREATE TABLE 문의 일부)이며 제약 조건이 다른 테이블을 참조 할 수도 있습니다.
먼저 SOLID를 적용하지 않고 현재 응용 프로그램이 어떻게 보이는지 설명하겠습니다.
현재이 응용 프로그램에는 테이블이 소유 한 제약 조건에 대한 포인터 목록과이 테이블을 참조하는 제약 조건에 대한 포인터 목록이 포함 된 "테이블"클래스가 있습니다. 연결이 설정 될 때마다 역방향 연결도 설정됩니다. 테이블에는 createStatement () 메소드가 있으며, 각 메소드의 createStatement () 함수를 호출합니다. 상기 방법은 그 이름을 검색하기 위해 소유자 테이블 및 참조 테이블에 대한 연결을 사용한다.
분명히 이것은 SOLID에는 전혀 적용되지 않습니다. 예를 들어, 필요한 "add"/ "remove"메소드와 일부 대형 오브젝트 소멸자 측면에서 코드를 부풀린 순환 종속성이 있습니다.
따라서 몇 가지 질문이 있습니다.
- Dependency Injection을 사용하여 순환 종속성을 해결해야합니까? 그렇다면 제약 조건이 생성자에서 소유자 (및 선택적으로 참조 된) 테이블을 받아야한다고 가정합니다. 그러나 단일 테이블에 대한 제약 조건 목록을 어떻게 실행할 수 있습니까?
- Table 클래스가 모두 자체 상태 (예 : 테이블 이름, 테이블 주석 등)와 제약 조건에 대한 링크를 저장하는 경우 이러한 단일 책임 원칙을 생각할 때 이러한 하나 또는 두 개의 "책임"입니까?
- 사례 2가 옳은 경우 논리 비즈니스 계층에서 링크를 관리하는 새 클래스를 만들어야합니까? 그렇다면 1. 더 이상 관련이 없습니다.
- "createStatement"메소드가 Table / Constraint 클래스의 일부 여야합니까, 아니면 제거해야합니까? 그렇다면 어디로 가야합니까? 각 데이터 스토리지 클래스 당 하나의 Manager 클래스 (예 : Table, Constraint, ...)? 아니면 링크 당 관리자 클래스를 만드십시오 (3과 유사)?
이 질문 중 하나에 답하려고 할 때마다 나는 어딘가에서 서클에서 달리고 있습니다.
열, 인덱스 등을 포함하면 문제가 훨씬 더 복잡해 지지만 간단한 테이블 / 제약 문제로 나를 도울 수 있다면 나머지는 스스로 해결할 수 있습니다.