A. Report.java의 코드를 리팩터링 한다고 가정할때, 그 과정에서 함수를 뽑아낼수 있는 지
 네개의 코드 블록에 동그라미를 쳐보자

 
    public static void report(Writer out, List machines, Robot robot)
            throws IOException
    {
        out.write("FACTORY REPORT\n");

        Iterator line = machines.iterator();
        while (line.hasNext()) {
            Machine machine = (Machine) line.next();
            out.write("Machine " + machine.name());

            if (machine.bin() != null)
                out.write(" bin=" + machine.bin());

            out.write("\n");
        }
        out.write("\n");

        out.write("Robot");
        if (robot.location() != null)
            out.write(" location=" + robot.location().name());

        if (robot.bin() != null)
            out.write(" bin=" + robot.bin());

        out.write("\n");

        out.write("========\n");
    }

 B. 위에서 찾아 낸 각 블록에 Extract Method를 적용했다고 가정하고 report() 메소드를 네 개의
 수행문으로 작성해 보자.

  public static void report(Writer out, List machines, Robot robot)
            throws IOException
    {
        printTitle(out);

        printMachine(out, machines);

        printRobot(out, robot);

        printEnd(out);
    }

 private static void printEnd(Writer out) throws IOException {
  out.write("========\n");
 }

 private static void printTitle(Writer out) throws IOException {
  out.write("FACTORY REPORT\n");
 }

 private static void printRobot(Writer out, Robot robot) throws IOException {
  out.write("Robot");
        if (robot.location() != null)
            out.write(" location=" + robot.location().name());

        if (robot.bin() != null)
            out.write(" bin=" + robot.bin());

        out.write("\n");
 }

 private static void printMachine(Writer out, List machines)
   throws IOException {
  Iterator line = machines.iterator();
        while (line.hasNext()) {
            Machine machine = (Machine) line.next();
            out.write("Machine " + machine.name());

            if (machine.bin() != null)
                out.write(" bin=" + machine.bin());

            out.write("\n");
        }
        out.write("\n");
 }

이게 다는 아니지만, 좋은 첫 단계가 될것이다.
여기서 더 나아가면 Report클래스를 뽑아내거나 Machine과 Robot 클래스에 report()  메서드를 끼워 넣을 수도 있을 것이다.

 C. 한 줄로 된 메서드를 뽑아내는 것이 타당한가?
메서드로 뽑아내면 비슷한 유형의 메서드를 통해 추상화가 가능할 수도 있고,
추후에 중복(또는 변경된후 중복)되어서 사용 할수도 있기때문에, 한 줄로 된 메서드도 추출이 필요할 수도 있다.

물론 의사소통에 더 도움이 된다.

D. 긴 메서드를 찾아내기는 쉽다. 긴 메서드는 실제 코드에서 자주 나타난다. 왜일까?
코딩중에 메서드를 작성하면서, 특정한 지점에서 흐름을 끊고, 다른 클래스나, 다른 메소드를 새로 작성하는 것보다는
계속 이어서 긴 메서드를 작성하는 것이 습관화 되어있고 편하기 때문이다.

Posted by 영겁회귀