창발성은 단순하고 작은 요소들이 모여서 전체 시스템의 복잡성을 줄이고, 유지보수성을 높이며, 유연성과 확장성을 갖게 해주는 소프트웨어 설계의 특징.
창발성은 초기 설계 시점에 모든 것을 고려하고 설계하지 않아도 되며, 작은 단위의 결정과 기능을 조합하여 시스템을 개선해 나갈 수 있다는 개념입니다. 이를 통해 더 나은 소프트웨어 시스템을 만들 수 있습니다.
창발적 설계의 4가지 규칙을 지키면 소프트웨어의 품질이 높아진다 (아래는 우선순위순)
테스트를 철저히 거쳐 모든 테스트를 항상 통과하면 "테스트가 가능한 시스템"이다
테스트가 가능한 시스템을 만드려고하면 크기가 작고 하나의 목적을 수행하는 클래스가 나온다. srp를 준수한다.
아래는 불필요한 구현의 중복코드다
int size(){}
boolean isEmpty(){}
isEmpty메서드에서 size메서드를 이용하면 중복이 제거됨
boolean isEmpty(){
return size() == 0;
}
아래는 Template Method 패턴을 사용해 고차원 중복을 제거하는 예제
//추상 클래스 선생님
abstract class Teacher{
public void start_class() {
inside();
attendance();
teach();
outside();
}
// 공통 메서드
public void inside() {
System.out.println("선생님이 강의실로 들어옵니다.");
}
public void attendance() {
System.out.println("선생님이 출석을 부릅니다.");
}
public void outside() {
System.out.println("선생님이 강의실을 나갑니다.");
}
// 추상 메서드
abstract void teach();
}
// 국어 선생님
class Korean_Teacher extends Teacher{
@Override
public void teach() {
System.out.println("선생님이 국어를 수업합니다.");
}
}
//수학 선생님
class Math_Teacher extends Teacher{
@Override
public void teach() {
System.out.println("선생님이 수학을 수업합니다.");
}
}
//영어 선생님
class English_Teacher extends Teacher{
@Override
public void teach() {
System.out.println("선생님이 영어를 수업합니다.");
}
}
public class Main {
public static void main(String[] args) {
Korean_Teacher kr = new Korean_Teacher(); //국어
Math_Teacher mt = new Math_Teacher(); //수학
English_Teacher en = new English_Teacher(); //영어
kr.start_class();
System.out.println("----------------------------");
mt.start_class();
System.out.println("----------------------------");
en.start_class();
}
}
위 코드에서 Teacher 클래스가 전체적인 틀(start_class)을 짜고있고,
언어별 선생님 클래스에서 세부적으로 다른점 기능(teach)을 위임받는다
Template Method 패턴
상위 클래스에서 알고리즘의 공통적인 부분을 담당하고, 하위 클래스에서는 다른점들만 위임받는 패턴
https://coding-factory.tistory.com/712
자신이 이해하는 코드 !== 남(유지보수 할 사람)이 이해하는 코드
처음에 짤때 코드를 명확하게 짜야, 유지비수 비용이 적어진다
코드만 돌리고 넘어가지말고 조금만 더 주의를 기울여서 리팩토링 해라.
무의미하고 독단적인 정책탓에 클래스와 메서드 수가 늘어나기도 하는데,
가능한 독단적인 견해는 멀리하고 실용적인 방법을 택해라.??
자알보고갑니다~