언어 자료구조 알고리즘/프로그래밍 실습

[C# 소스] 클래스 간의 관계 - 4. 연관(Association) 관계

언제나휴일 2017. 9. 14. 11:35
반응형

[C# 소스] 클래스 간의 관계 - 4. 연관(Association) 관계

 

 

연관 관계는 명령 개체와 피 명령 개체가 명확하지 않은 관계입니다. 프로그램에서는 연관 관계로 표현하지 말고 직접 연관 관계로 표현하는 것이 안전합니다.

연관 관계는 약사와 의사처럼 “약사와 의사는 환자 치료에 연관이 있다.”와 같이 수평적인 관계입니다. 의사는 환자 치료를 위해 어떠한 약을 처방받아 먹고 있는지 알 수 있어야 합니다. 또한 약사는 약을 조재하기 위해서는 의사의 처방이 필요합니다.

그런데 이와 같은 관계에서 프로그램을 잘못 작성하여 버그가 날 위험이 많습니다. 예를 들어 의사의 “치료하다” 기능에서 약사의 “조재하다”를 호출하게 구현하고 약사의 “조재하다” 기능에서 의사의 “치료하다”를 호출한다면 스택 오버 플로우가 발생할 것입니다.

물론 주의하여 작성한다면 버그를 피하거나 버그 발생한 것을 수정할 수 있습니다. 하지만 프로그램의 규모가 커질수록 이러한 관계로 인한 버그를 잡는 것은 구조적으로 안전한 직접 연관 관계로 표현하는 것보다 많은 비용이 들 확률이 더 높습니다.

다음은 의사와 약사 사이의 연관 관계를 표현한 코드이며 스택 오버플로우 예외가 발생하는 버그가 존재하는 코드입니다.

using System;

//서로가 상대에게 명령을 내릴 수 있는 관계

//취약한 구조를 갖게 하여 다른 관계로 개선하면 좋다.

namespace 연관관계

{

    class Doctor

    {

        public void Treatment(Druggist druggist)

        {

            druggist.Hasty(this);

            Treatment();

        }

        public void Treatment()

        {

            Console.WriteLine("치료하다.");

        }

    }

    class Druggist

    {

        public void Hasty()

        {

            Console.WriteLine("조재하다.");

        }

        public void Hasty(Doctor doctor)

        {

            doctor.Treatment(this);

            Hasty();

        }

    }

    class Program

    {

        static void Main(string[] args)

        {

            Doctor doc = new Doctor();

            Druggist drug = new Druggist();

            doc.Treatment();

            drug.Hasty();

            doc.Treatment(drug);

            drug.Hasty(doc);

        }

    }

}

 

 

 

반응형