코드 재활용과 생산라인 증설 - 起

코드 재활용과 생산라인 증설 - 起

이철우

객체지향[참고 1] 언어가 나오면서 기존의 구조적 언어 또는 함수형 언어보다 더 쉽게 더 효율적으로 코드를 재활용할 수 있게 되었다. 이는 결과적으로 유지/보수할 코드가 줄어들어 프로그래머에게는 코드를 검토하는 부담을 줄이고 경영자에게는 코드 관련한 비용을 절감하는 효과가 있다.

어느 기업에서 공장에 라인을 추가하며 기존의 코드를 재활용한 방법을 소개하며 ‘이것보다는 더 좋은 다른 방법이 없을까?’ 생각하고, '객체지향’을 활용한 더 나은 다른 방법을 소개한다. 글은 起, 承, 轉, 結, 이렇게 네 꼭지로 나누어 쓸 것이다.

'起’에서는 이 글의 윤곽과 공장을 추상화한 코드를 도입하고 객체지향의 '숨기기’를 활용하여 앞의 코드를 분리할 것이다. '承’에서는 신규 생산라인에 쓸 코드를 기존 코드를 '복사’하여 가동하는 방법과 라인별로 '이름’을 붙여 재활용 하는 방법을 소개한다. '轉’에서는 객체지향의 '물려받기’를 이용한 재활용 방법으로 개선할 것이다. '結’에서는 앞의 세 방법을 비교하며 각각의 장단점을 살펴보겠다.

공장 추상화

공장은 재료를 준비(Get Ready)하고, 가동(Run)하며, 정지(Stop)하는 세 가지 기능이 있다. 재료는 나무와 쇠가 들어가며 준비에서 이를 입력 받고, 가동하면 나무와 쇠의 수를 더해 제품을 만든다. 정지하면 제품 수를 출력한다. 아래는 DotNet8 C# 콘솔 프로젝트로 만든 코드 - Program.cs - 이다. 기능과 실행이 한 파일에 있기에, 이 Program.cs 파일을 '한 파일에 모두’라고 부르겠다.

  • Program.cs -
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

string? input;
bool isInputCorrect;
int wood, steel;
int output;

GetReady();
Run();
Stop();

Console.WriteLine("Bye.");

void GetReady()
{
    isInputCorrect = false;
    input = Console.ReadLine();
}

void Run()
{
    var words = input!.Split(' ');

    if (words!.Length == 2)
    {
        isInputCorrect = true;
        wood = int.Parse(words[0]);
        steel = int.Parse(words[1]);
        output = wood + steel;
    }
    else
    {
        isInputCorrect = false;
        output = 0;
    }
}

void Stop()
{
    if (isInputCorrect)
    {
        Console.WriteLine($"Output: {output}");
    }
    else
    {
        Console.WriteLine("Input is not correct.");
    }
}

‘숨기기’ 이용하여 코드 분리

준비, 가동, 정지, 이 세 가지 기능을 갖는 interface IFactory.cs를 만들고, 위 '한 파일에 모두’에서 Factory.cs를 분리하자.

  • IFactory.cs -
    internal interface IFactory
    {
        void GetReady();
        void Run();
        void Stop();
    }

  • Factory.cs -
    internal class Factory : IFactory
    {
        private string? _input;
        private bool _isInputCorrect;
        private int _wood, _steel;
        private int _output;

        public void GetReady()
        {
            _isInputCorrect = false;
            _input = Console.ReadLine();
        }

        public void Run()
        {
            var words = _input!.Split(' ');

            if (words!.Length == 2)
            {
                _isInputCorrect = true;
                _wood = int.Parse(words[0]);
                _steel = int.Parse(words[1]);
                _output = _wood + _steel;
            }
            else
            {
                _isInputCorrect = false;
                _output = 0;
            }
        }

        public void Stop()
        {
            if (_isInputCorrect)
            {
                Console.WriteLine($"Output: {_output}");
            }
            else
            {
                Console.WriteLine("Input is not correct.");
            }
        }
    }

그리고 위 Program.cs를 다음과 같이 바꾼다. 기능(Factory.cs)과 실행(Program.cs)을 분리했기에 이 Program.cs 파일을 '실행만 함’이라고 부르겠다.

  • Program.cs -
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

IFactory factory = new Factory();

factory.GetReady();
factory.Run();
factory.Stop();

Console.WriteLine("Bye.");

코드를 분리하는 과정에 알게 모르게 SOLID[참고 2] 중 몇 개가 적용되었을 수 있다. 다음 글 - 承 - 에서 객체지향 있기 前의 생산라인 증설 방법에 대해 알아보자.

[참고 1] 객체지향 프로그래밍

[참고 2] The Principles of OOD
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

6 Likes

숨기기, 물려 받기.

꽤 괜찮은 번역 같습니다. ^^

1 Like