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

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

이철우

증설 생산라인 추상화와 기존 코드 복사

새로 더하는 생산라인도 기존과 마찬가지로 준비, 가동, 정지, 세 가지 기능이 있다. 재료에 기름이 더해지고 생산품목이 하나 늘어난다.

아래는 '起’에서 작성한 '한 파일에 모두’를 '복사’하고 신설라인 기능에 맞게 고친 것이다. 복사/수정한 코드는 새로 만든 DotNet8 C# 콘솔 프로젝트의 ProgramCopyUpdateNew.cs에 넣었다. 이 파일을 '복사/수정 신설’이라고 부르겠다.

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

string? input;
bool isInputCorrect;
int wood, steel, oil;
int output1, output2;

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

Console.WriteLine("Bye.");

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

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

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

void Stop()
{
    if (isInputCorrect)
    {
        Console.WriteLine($"Output1: {output1}, Output2: {output2}");
    }
    else
    {
        Console.WriteLine("Input is not correct.");
    }
}

이렇게 하면, 기존 생산라인과 신설 생산라인의 코드가 별개이며, 서로 다른 실행파일에서 작동하게 된다. 생산라인이 늘어날 때마다 코드도 늘어난다. 코드를 재활용하지 않은 생산라인 증설이다.

생산라인에 이름 붙여 코드 재활용

생산라인별로 '이름’을 주어 구별할 수 있게 하고 이를 코드에서 활용하자.

  • LineName.cs -
    internal enum LineName : byte
    {
        LINE_A,
        LINE_B,
    }

'起’의 Factory.cs를 ‘업그레이드’ 하고 파일이름을 FactoryByName.cs라 하자. 이에 맞게 Program.cs도 바꾸고 ProgramByName.cs라 하자.

  • FactoryByName.cs -
    internal class FactoryByName : IFactory
    {
        private readonly LineName _lineName;
        private string? _input;
        private bool _isInputCorrect;
        private int _wood, _steel, _oil;
        private int _output1, _output2;

        private FactoryByName() { }
        public FactoryByName(LineName lineName)
        {
            _lineName = lineName;
        }

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

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

            switch (_lineName)
            {
                case LineName.LINE_A:
                    if (words!.Length == 2)
                    {
                        _isInputCorrect = true;
                        _wood = int.Parse(words[0]);
                        _steel = int.Parse(words[1]);
                        _output1 = _wood + _steel;
                    }
                    else
                    {
                        _isInputCorrect = false;
                        _output1 = 0;
                    }
                    break;
                case LineName.LINE_B:
                    if (words!.Length == 3)
                    {
                        _isInputCorrect = true;
                        _wood = int.Parse(words[0]);
                        _steel = int.Parse(words[1]);
                        _oil = int.Parse(words[2]);
                        _output1 = _wood + _steel;
                        _output2 = _steel + _oil;
                    }
                    else
                    {
                        _isInputCorrect = false;
                        _output1 = 0;
                        _output2 = 0;
                    }
                    break;
            }
        }

        public void Stop()
        {
            if (_isInputCorrect)
            {
                switch (_lineName)
                {
                    case LineName.LINE_A:
                        Console.WriteLine($"{_lineName} Output: {_output1}");
                        break;
                    case LineName.LINE_B:
                        Console.WriteLine($"{_lineName} Output1: {_output1}, Output2: {_output2}");
                        break;
                }
            }
            else
            {
                Console.WriteLine("Input is not correct.");
            }
        }
    }
  • ProgramByName.cs -
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

var lines = new List<IFactory>
{
    new FactoryByName(LineName.LINE_A),
    new FactoryByName(LineName.LINE_B),
};

foreach (var line in lines)
{
    line.GetReady();
    line.Run();
    line.Stop();
}

Console.WriteLine("Bye.");

생산라인 이름 빼고는 코드 파일을 더 만들지 않았고 또 하나의 실행파일로 두 생산라인을 가동한다. 생산라인이 또 늘어난다면 '업그레이드’는 좀 더 쉽다. 기존 코드를 고쳐 생산라인을 증설한 코드 재활용이다.

다음 글 '轉’에서는 객체지향의 '물려받기’를 이용한 생산라인 증설을 알아보자.