창발성

김태완·2023년 5월 16일
1

독서 스터디

목록 보기
3/8

창발성

창발성은 단순하고 작은 요소들이 모여서 전체 시스템의 복잡성을 줄이고, 유지보수성을 높이며, 유연성과 확장성을 갖게 해주는 소프트웨어 설계의 특징.

창발성은 초기 설계 시점에 모든 것을 고려하고 설계하지 않아도 되며, 작은 단위의 결정과 기능을 조합하여 시스템을 개선해 나갈 수 있다는 개념입니다. 이를 통해 더 나은 소프트웨어 시스템을 만들 수 있습니다.

창발적 설계의 4가지 규칙을 지키면 소프트웨어의 품질이 높아진다 (아래는 우선순위순)

  1. 모든 테스트를 실행
  2. 중복을 없앤다
  3. 의도를 표현
  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

의도를 표현

자신이 이해하는 코드 !== 남(유지보수 할 사람)이 이해하는 코드
처음에 짤때 코드를 명확하게 짜야, 유지비수 비용이 적어진다

  1. 좋은이름
  2. 함수와 클래스의 크기를 가능한 줄인다
  3. 표준명칭을 사용(사용한 패턴이 있다면 패턴명을 클래스명에 이용)
  4. 단위테스트 꼼꼼히

코드만 돌리고 넘어가지말고 조금만 더 주의를 기울여서 리팩토링 해라.

클래스와 메서드 수를 최소화

무의미하고 독단적인 정책탓에 클래스와 메서드 수가 늘어나기도 하는데,
가능한 독단적인 견해는 멀리하고 실용적인 방법을 택해라.??

profile
프론트엔드개발

1개의 댓글

comment-user-thumbnail
2023년 5월 24일

자알보고갑니다~

답글 달기