⇒ 테스트 등을 위해 private 변수 및 메소드를 protected로 선언하여 접근을 허용하기도 하지만, 캡슐화를 풀기 전에 이를 비공개 상태로 유지할 온갖 방법을 강구해야 한다.
예시로 쓰려고 했던 프로젝트를 타입스크립트 + 리액트 네이티브로 만들었기에, 근래 함수형 컴포넌트 작성을 지향하는 리액트 네이티브는 클래스로 쓰는 것이 거의 없었다.
그리하여, 하나의 예시 코드를 작성해보고, 위의 코드를 지키면서 수정해보고자 한다.
public class HeadPhone {
public void outSound(Sound outputSound);
private void equalizeSound(Sound inputSound);
public void checkInputSound(Sound inputSound);
public Sound inputSound;
public Sound outputSound;
private Sound digitalSound;
static public Sound mainSound;
static public boolean isMute;
public boolean getHeadPhoneAvailiable(boolean isMute, Sound inputSound);
public String getSoundPath(Sound outputSound, Sound inputSound);
}
위의 예시는 헤드폰의 기능 및 설정 등을 다루는 클래스다. 위의 클래스는 1. 표준 자바 관례, 2. SRP, 3. 응집도를 낮게 유지 등 본문의 여러 방법을 따르지 않고 있다.
public, private 간의 순서와 변수 및 메소드 간의 순서를 지키지 않았고 (1번), 스피커와 마이크의 책임을 한 번에 다루고 있으며 (2번), 응집도도 변수 사용이 많아짐에 따라 높기 때문이다.(3번)
이를 의식하여 고친다면 다음과 같이 바뀔 수 있다.
public class Speaker{
public Sound outputSound;
private Sound digitalSound;
public void outSound(Sound outputSound);
}
public class Microphone {
static public Sound mainSound;
static public boolean isMute;
public Sound inputSound;
private Sound digitalSound;
public boolean getHeadPhoneAvailiable(boolean isMute, Sound inputSound);
public void checkInputSound(Sound inputSound);
private void equalizeSound(Sound inputSound);
}
public과 private간의 순서를 맞췄으며, 상수→변수→메소드 순서로 가는 자바 관례를 지켰다. 또한 각각의 책임을 갖는 클래스로 쪼개어 책임을 최소한으로 가져가게 구현하였으며, 이를 통해 응집도도 낮추었다.
클래스의 클린코드 작성 방법은 함수와 매우 비슷하다. 작은 단위로 쪼개는 조건을 다르게 지정하였을 뿐, 작성 관례 및 최소 단위를 지향하는 등의 행위는 많은 점이 닮아있다.
그리하여 책임을 적게 쥐어주며 최대한 추상적으로 클래스를 작성하는 것은 코드를 깔끔하게 유지해 줄 것이며, 요구사항 변경으로 인한 구현의 어려움에서 다소 쉽게 탈출시켜 줄 것이다.
댓글