OO 디자인 조언 찾기


12

산업 환경에서 밸브를 열고 닫는 데 사용될 앱을 개발 중이며 다음과 같은 간단한 것을 생각하고있었습니다.

public static void ValveController
{
    public static void OpenValve(string valveName)
    {
        // Implementation to open the valve
    }

    public static void CloseValve(string valveName)
    {
        // Implementation to close the valve
    }
}

(이 구현은 밸브를 제어하기 위해 직렬 포트에 몇 바이트의 데이터를 기록합니다. 밸브 이름에서 파생 된 "주소", 밸브를 열거 나 닫는 "1"또는 "0".

다른 개발자는 우리가 대신 수십 개의 물리 밸브마다 별도의 클래스를 만들어야하는지 물었습니다. 나는 PlasmaValve.Open()보다 코드를 작성하는 것이 더 좋을 것이라고 동의 ValveController.OpenValve("plasma")하지만, 이것은 과잉입니까?

또한 몇 가지 가상의 미래 요구 사항을 염두에두고 디자인을 다루는 가장 좋은 방법이 궁금합니다.

  1. 밸브를 열고 닫는 데 다른 값을 요구하는 새로운 유형의 밸브를 지원해야합니다 (0 및 1 아님).
  2. 우리는 단순히 "열기"또는 "닫힘"이 아닌 0-100의 어떤 위치로도 설정할 수있는 밸브를지지해야합니다.

일반적으로 이런 종류의 상속을 사용하지만 최근에는 "상속 상속 구성"에 대해 머리를 get 기 시작했고 컴포지션을 사용했을 때 더 매끄러운 솔루션이 있는지 궁금합니다.


2
특정 밸브 (문자열, 열거 형이 아닌)의 식별자와 OpenValve / CloseValve 메서드 내부의 제어 흐름에 필요한 정보가있는 일반 밸브 클래스를 만듭니다. 대안으로 밸브 클래스를 추상화하고 각각에 대해 별도의 구현을 할 수 있습니다. 여기에서 밸브마다 다른 개폐 메커니즘이있는 경우 개폐 밸브가 지정된 밸브 클래스 내부의 논리를 호출합니다. 공통 메커니즘은 기본 클래스에서 정의됩니다.
Jimmy Hoffa

2
가상의 미래 요구 사항에 대해 걱정하지 마십시오. 야 그니.
pdr

3
@ pdr YAGNI는 양면 블레이드입니다. 일반적으로 다음과 같은 가치가 있다고 생각하지만 극단적으로 찍은 것은 향후 유지 보수 또는 가독성이 YAGNI를 위반하는 것을 도울 수있는 일을 할 수 있다고 말할 수 있습니다.이 때문에 YAGNI의 범위가 너무 모호합니다. 많은. 즉, 많은 사람들이 YAGNI를 사용할 곳과 그것을 어디로 던질지를 알고 있습니다. 나는 사람들이 그 스펙트럼에서 어디로 착륙할지 모르는 경우 YAGNI를 따르라고 제안하는 것을 조심해야한다고 생각합니다.
Jimmy Hoffa

2
'상속성 구성'이 과장되었습니다. Valve 추상 클래스 / 인터페이스를 만든 다음 PlasmaValve로 서브 클래스합니다. 그런 다음 ValveController가 정확히 어떤 하위 클래스에 신경 쓰지 않고 Valve와 함께 작동하는지 확인합니다.
MrFox

2
@suslik : 물론입니다. 나는 또한 SOLID 원리를 이해하지 못하는 사람들에 의해 스파게티라는 훌륭한 코드를 보았습니다. 우리는 이것으로 영원히 갈 수 있습니다. 내 요점은 과잉 밀착으로 인한 것보다 기존의 원칙 (수년간의 경험으로 태어난)을 무시함으로써 발생하는 더 많은 문제를 본 것입니다. 그러나 나는 두 극단 모두 위험하다는 데 동의합니다.
pdr

답변:


12

밸브 개체의 각 인스턴스가이 ValveController와 동일한 코드를 실행하는 경우 단일 클래스의 여러 인스턴스가 올바른 방법 인 것 같습니다. 이 경우 밸브 개체의 생성자에서 제어하는 ​​밸브 및 방법을 구성하십시오.

그러나 각 밸브 제어에 다른 코드를 실행해야하고 현재 ValveController가 밸브 유형에 따라 다른 작업을 수행하는 거대한 switch 문을 실행하는 경우 다형성을 제대로 구현하지 않은 것입니다. 이 경우 공통 기반을 가진 여러 클래스에 다시 작성하고 (있는 경우) 단일 책임 원칙을 설계 지침으로 삼으십시오.


1
유형 기반 스위치 문을 코드 냄새로 언급하면 ​​+1입니다. 개발자가 KISS를 따르고 있다고 주장하는 이러한 종류의 스위치 설명을 자주 볼 수 있습니다. 디자인 원칙 ㅎ 음란 할 수있는 방법의 완벽한 예
지미 호파

2
여러 인스턴스를 사용하면 밸브를 순서대로 연결하기가 더 쉬워 지므로 실제 플랜트 배관을 코드에서 직접 그래프로 모델링 할 수 있습니다. 그런 다음 압력 증가를 피하기 위해 다른 밸브를 닫을 때 밸브 하나를 열거 나 모든 다운 스트림 밸브를 닫아 "물 망치"효과를 얻지 못하는 경우를 대비하여 비즈니스 로직을 클래스에 추가 할 수 있습니다. 밸브가 다시 열릴 때.
TMN

1

내 주요 그립은 밸브를 식별하는 매개 변수에 문자열을 사용하고 있습니다.

최소한 기본 구현에 필요한 형식의 Valve클래스를 만들고 클래스에 getAddress전달하고 ValveController존재하지 않는 밸브를 만들 수 없도록하십시오. 이렇게하면 각 open 및 close 메소드에서 잘못된 문자열을 처리 할 필요가 없습니다.

열기 및 닫기를 호출하는 편리한 메소드를 작성하는지 여부는 사용자에게 ValveController달려 있지만 솔직히 말하면 다른 클래스가 필요할 때 호출 할 단일 클래스에서 직렬 포트 (인코딩 포함)와의 모든 통신을 유지합니다. 즉, 새 컨트롤러로 마이그레이션해야 할 경우 하나의 클래스 만 수정하면됩니다.

테스트를 좋아한다면 ValveController싱글 톤을 만들어서 조롱하거나 조작자를위한 트레이닝 머신을 만들어야합니다.


나는 아무도 전에 테스트를 위해 싱글 톤을 추천하는 것을 본 적이 없다.
Kazark

솔직히 싱글은 정적을 방지하고 통신이 동기화 될 수 있도록하기 위해 더
래칫 괴물
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.