한개의 클레스에서 멤버변수가 많을 수록 가독성이 떨어 집니다.
코드 분석시, 한 class 안에서 변수들 어떻게 읽히고, 쓰이고, 그것들의 관계가 어떻게 되는지 추적 해야 하기 때문인데, 그 수가 많을 수 록 마구 뭉쳐진 실타레 처럼 분석하기 어렵습니다.
즉 가독성이 떨어지면 분석하는데 시간이 많이 걸립니다.그리고 “가독성이 좋다” 는 결국 “모듈화가 잘 되어 있다” 가 됩니다.
아래 예제는 선과 원을 그리는 가독성이 낮은 코드의 예제 입니다.
class Line { int startX, startY; int endX, endY; int colorR, colorG, colorB; public void setStart(int x, int y){ startX = x; startY = y; } public void setEnd(int x, int y){ endX = x; endY = y; } public void setColor(int r, int g, int b){ colorR = r; colorG = g; colorB = b; } public void draw() { // Implementation required } } class Circle { int centerX, centerY; int radius; int colorR, colorG, colorB; int borderThickness; int borderColorR, borderColorG, borderColorB; public void setCenter(int x, int y){ centerX = x; centerY = y; } public void setRadius(int r){ radius = r; } public void setColor(int r, int g, int b){ colorR = r; colorG = g; colorB = b; } public void setBorderThickness(int thickness) { borderThickness = thickness; } public void setBorderColor(int r, int g, int b){ borderColorR = r; borderColorG = g; borderColorB = b; } public void draw(){ // Implementation required } } int main() { Line line = new Line(); line.setStart(10, 10); line.setEnd(20, 40); line.setColor(255,0,0); line.draw(); Circle circle = new Circle(); circle.setCenter(20, 40); circle.setRadius(10); circle.setColor(0,0,255); circle.setBorderThickness(2); circle.setBorderColor(0,255, 0); circle.draw(); }
위의 코드에서 Line class는 멤버변수(startX, startY, endX …) 가 7개 이고, circle은 10개가 됩니다. 그럼 위의 코드를 리펙토링 해보겠습니다.
멤버변수들 에서 X(statX ..), Y(startY ..) 로 끝나는 좌표 값들과 들과 R,G,B 로 끝나는 Color 값들을 묶을수가 있겠네요. 묶는 기준은 항상 같이 사용 된다고 판단 되기 때문 입니다. 좌표는 X, Y가 항상 같이 쓰이고 Color 의 r,g,b 또한 그렇지요.
그럼 아래와 같이 좀더 가독성이 좋은 코드가 됩니다.
class Point{ int x; int y; public Point(int xx, int yy){ x = xx; y = yy; } } class Color{ int r; int g; int b; public Color(int rr, int gg, int bb) { r = rr; g = gg; b = bb; } } class Line { Point start; Point end; Color color; public void setStart(Point point){ start = point; } public void setEnd(Point point){ end = point; } public void setColor(Color rgb){ color = rgb; } public void draw() { // Implementation required } } class Circle { Point center; int radius; Color color; int borderThickness; Color borderColor; public void setCenter(Point point){ center = point; } public void setRadius(int r){ radius = r; } public void setColor(Color rgb){ color = rgb; } public void setBorderThickness(int thickness) { borderThickness = thickness; } public void setBorderColor(Color rgb){ borderColor = rgb; } public void draw(){ // Implementation required } } int main() { Line line = new Line(); line.setStart(new Point(10, 10)); line.setEnd(new Point(20, 40)); line.setColor(new Color(255,0,0)); line.draw(); Circle circle = new Circle(); circle.setCenter(new Point(20, 40)); circle.setRadius(10); circle.setColor(new Color(0,0,255)); circle.setBorderThickness(2); circle.setBorderColor(new Color(0,255, 0)); circle.draw(); }
결국 Line class 는 멤버 변수 개수가 7 -> 3 개로 Circle는 10 -> 5개로 줄었습니다.
위의 코드에 만족 하시나요? 제 눈에는 좀 더 가독성 높은 코드를 만들 수 있어 보이네요. 다음에는 해당 코드로 “가독성 높은 코드 만들기 방법 #2” 를 올리겠습니다.