Repository navigation
Design Document
#Gradle
- 1 맥북, 1 기가바이트, 2 서피스로 개발 환경의 차이가 심함
- 개발 환경을 최대한 맞추기 위해 jetbrain의 IntelliJ를 이용하고 Build tool로 gradle을 선택.
- Gradle
#LCS Algorithm (작성중)
이 프로젝트에서는 LCS 알고리즘이 아래와 같은 인터페이스 하에 호출되도록 되어 있다.
public class LCS<T extends Comparable<T>> implements Diff.Algorithm<T> {
@Override
public List<Pair<Integer>> diff(List<T> l, List<T> r) { ... }
...
}LCS 알고리즘을 수행하는 LCS Class는 Generic으로 Comparable의 서브타입을 받도록 설계하였다. LCS 알고리즘은 2개 요소가 동일한 요소인지만 판단할 수 있으면 수행할 수 있기 때문이다. 이에 적합한 compareTo 메소드를 가진 Comparable 인터페이스에 의존하도록 하였다.
따라서 이후에 텍스트를 String보다 복잡한 클래스를 사용하더라도 Comparable의 메소드만 구현하면 LCS 알고리즘에 그대로 사용할 수 있다.
diff 메소드는 List<Pair>를 반환하는데, Pair는 Integer 쌍을 담는 클래스이다. 각 Pair는 LCS 알고리즘 하에서 매칭되는 인덱스 쌍이다. 예를 들어 List l, r이 Integer로 아래 처럼 들어왔다고 가정하면 l: [1, 2, 3] r: [1, 3, 4] 이면 LCS는 [1, 3] 이다.
LCS의 첫 요소인 1에 대해서는 Pair는 {0, 0} 이다. LCS의 두번째 요소인 3에 대해서는 Pair는 {2, 1} 이다. l에서는 index 2 위치에 3이 있고, r에서는 index 1 위치에 3이 있기 때문이다.
#User Requirement
#MVC ##MVC?
- 현 프로젝트는 MVC 패턴을 적용시키기에는 적합하지 않다고 판단.
- Model이 매우 작음. 실질적으로 View, Controller 부분에서 대부분 처리가 가능함.
##Our MVC
- MVC 구조도
- Controller "A" class는 Model의 "C" class와 View의 Fxml을 직접 종속중이다.
- Highlight 정보가 변경되는 경우, "B" class에서 "C" class로 update()를 해준다.
- 변경된 정보를 "C" class가 인터페이스를 호출하여 "A" class에 이벤트를 날려준다.
- Fxml에서의 변경된 이벤트를 인터페이스를 통해 "A" class에 전달해준다.
#SOLID ##단일 책임 원칙(SRP)
- 한 클래스는 하나의 책임만 가져야 한다.
##개방-폐쇄 원칙(OCP)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀있어야 한다.
- Generic으로 구현된 Pair는 모듈의 기능 확장이나 변경을 다른 클래스와 무관하게 진행 할 수 있다.
##리스코프 치환 원칙(LSP)
- 프로그램의 객체는 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 인스턴스를 바꿀 수 있어야 한다.
- Diff는 보이는 바와 같이 Algorithm을 구현하고 있다. 이 Algorithm 부분은 Algorithm을 implement 중인 LCS로 교체 하여도 프로그램의 정확성이 유지된다.
##인터페이스 분리 원칙(ISP)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 저장 및 불러오기 부분의 함수를 맡는 EditPanelEventListener와 FileChooser을 이용하는 함수를 맡는 FileSelector를 분리.
##의존관계 역전 원칙(DIP)
- 프로그래머는 추상화에 의존해야지 구체화에 의존하면 안된다.
-
- UML 사진을 올려 상속을 받지 않고 추상화에 의존했음을 보인다
#Designed to be testable by unit-test tools
- 개발이 끝난 뒤 uml이나 code 사진을 부착할 예정
- Mock이 테스트를 할 수 있도록 각각의 컴포넌트나 기능들이 서로 의존적이지 않도록 Interface로 분리.
- 추가 내용을 입력해주세요.