“Info”접미사를 사용하여 클래스 이름을 정하는 아이디어는 무엇입니까 (예 :“SomeClass”및“SomeClassInfo”)?


20

실제 장치를 다루는 프로젝트에서 일하고 있으며이 프로젝트에서 일부 클래스의 이름을 올바르게 지정하는 방법에 대해 혼란스러워했습니다.

실제 장치 (센서 및 수신기)가 한 가지이며 소프트웨어에서 의 표현 이 다른 것도 고려할 때 "Info"접미사 이름 패턴으로 일부 클래스의 이름을 지정하려고합니다.

예를 들어, a Sensor는 실제 센서를 나타내는 클래스이지만 (실제로 일부 작동 장치에 연결된 경우) SensorInfo해당 센서의 특성 만 나타내는 데 사용됩니다. 예를 들어 파일을 저장할 때을 직렬화하는 SensorInfo대신 파일 헤더에 a를 직렬화하면 Sensor이해할 수 없습니다.

그러나 이제는 하나의 객체를 사용해야하는지 또는 다른 것을 가져 오는 방법을 결정하거나 두 변형을 실제로 하나의 클래스로 축소해야하는지 여부를 결정할 수없는 객체의 수명주기에 대한 중간 근거가 있기 때문에 혼란스러워합니다.

또한 너무 일반적인 예제 Employee클래스는 분명히 실제 사람을 나타내는 것입니다. 그러나 아무도 EmployeeInfo아는 한 클래스 이름을 제안하지 않습니다.

내가 사용하는 언어는 .NET 이며이 명명 패턴은 프레임 워크 전체에서 공통적 인 것으로 보입니다.이 클래스의 예는 다음과 같습니다.

  • Directory그리고 DirectoryInfo수업;
  • File그리고 FileInfo수업;
  • ConnectionInfo클래스 (대응 Connection클래스 가 없음 );
  • DeviceInfo클래스 (대응 Device클래스 가 없음 );

그래서 내 질문은 :이 명명 패턴을 사용하는 것에 대한 일반적인 근거가 있습니까? 이름 쌍 ( ThingThingInfo) 을 갖는 것이 합당한 경우와 ThingInfo해당 Thing클래스가없는 클래스 또는 클래스 만 존재하는 다른 경우가 있습니까?


5
Ben Aaronson은 아래의 답변에서 바로 알 수 있습니다. Info접미사는 구분 static의 상태 대응에서 유틸리티 메소드를 포함하는 클래스를. "모범 사례"는 아닙니다. 그것은 .NET 팀이 특정 문제를 해결하기 위해 고안 한 방법입니다. 그들은 단지 쉽게이 함께 올 수 FileUtilityFile있지만, File.DoSomething()FileInfo.FileName더 읽을 것 같다.
Robert Harvey

1
이것은 일반적인 패턴이지만 언어와 API가있는 것처럼 많은 명명 규칙이 있습니다. 예를 들어, Java에서 상태 저장 클래스가있는 경우 Foo인스턴스화 할 수없는 유틸리티 클래스가있을 수 있습니다 Foos. 이름 지정과 관련하여 중요한 것은 API 내에서의 일관성과 이상적으로 플랫폼의 API 간입니다.
Kevin Krumwiede

1
정말? "아무도 클래스 이름을 EmployeeInfo로 제안하지 않겠습니까?"?? 아무도? 그다지 명백하지 않은 것에 대해서는 조금 강해 보입니다.
ThePopMachine

@ThePopMachine이 경우에는 "아무도"라는 단어가 너무 어려울 수 있다는 데 동의하지만 Employee, EmployeeInfo아직 보지 못했지만 온라인이나 고전 서적에서 수십 명이 예를 볼 수 있습니다. 연결 또는 파일과 같은 기술적 구성). 그러나 수업 EmployeeInfo이 프로젝트에서 제안 된다면 , 나는 수업 을 사용할 수 있다고 생각합니다.
heltonbiker

답변:


21

"정보"는 잘못된 것 같습니다. 개체에는 상태와 동작이 있습니다. "info"는 이미 OOP에 구운 "state"의 또 다른 이름입니다.

여기서 실제로 모델링하려고하는 것은 무엇입니까 ? 다른 코드에서 사용할 수 있도록 소프트웨어의 하드웨어를 나타내는 객체가 필요합니다.

말하기는 쉽지만, 알다시피 그 이상이 있습니다. "하드웨어 대표"는 놀라 울 정도로 광범위합니다. 이를 수행하는 객체에는 몇 가지 우려가 있습니다.

  • USB 인터페이스, 직렬 포트, TCP / IP 또는 독점 연결과 통신하는 저수준 장치 통신
  • 상태 관리. 장치가 켜져 있습니까? 소프트웨어와 대화 할 준비가 되셨습니까? 바쁜?
  • 이벤트 처리. 장치가 데이터를 생성했습니다. 이제 관심있는 다른 클래스로 전달할 이벤트를 생성해야합니다.

센서와 같은 특정 장치는 프린터 / 스캐너 / 팩스 다기능 장치보다 걱정이 적습니다. 센서는 비트 스트림을 생성하는 반면 복잡한 장치는 복잡한 프로토콜과 상호 작용을 가질 수 있습니다.

어쨌든 특정 질문으로 돌아가서 특정 요구 사항과 하드웨어 상호 작용의 복잡성에 따라 여러 가지 방법이 있습니다.

다음은 온도 센서의 클래스 계층 구조를 디자인하는 방법의 예입니다.

  • ITemperatureSource : 온도 데이터를 생성 할 수있는 모든 것을 나타내는 인터페이스 : 센서, 파일 래퍼 또는 하드 코딩 된 데이터 일 수도 있습니다 (생각 테스트 : 모의 테스트).

  • Acme4680Sensor : ACME 모델 4680 센서 (로드 러너가 가까이있을 때 감지하기에 좋습니다). 여러 인터페이스를 구현할 수 있습니다.이 센서는 온도와 습도를 모두 감지합니다. 이 개체에는 "센서가 연결되어 있습니까?"와 같은 프로그램 수준 상태가 포함됩니다. "마지막 독서는 무엇입니까?"

  • Acme4680SensorComm는 : 중고 전적으로 물리적 장치와 통신. 많은 상태를 유지하지 않습니다. 메시지를 보내고받는 데 사용됩니다. 하드웨어가 이해하는 각 메시지에 대해 C # 메소드가 있습니다.

  • HardwareManager : 장치를 가져 오는 데 사용됩니다. 이것은 기본적으로 인스턴스를 캐시하는 팩토리입니다. 각 하드웨어 장치마다 하나의 장치 개체 인스턴스 만 있어야합니다. 나사산 A가 ACME 온도 센서를 요청하고 나사산 B가 ACME 습도 센서를 요청하는 경우 이들은 실제로 동일한 물체이므로 두 나사산으로 모두 반환해야한다는 것을 알기에 충분히 똑똑해야합니다.


최상위 레벨에는 각 하드웨어 유형에 대한 인터페이스가 있습니다. C # 데이터 형식 (예 : 원시 장치 드라이버가 사용할 수있는 바이트 배열이 아님)을 사용하여 C # 코드가 장치에서 수행하는 작업에 대해 설명합니다.

같은 수준에서 각 하드웨어 유형마다 하나의 인스턴스가있는 열거 클래스가 있습니다. 온도 센서는 한 가지 유형일 수 있고 다른 하나는 습도 센서 일 수 있습니다.

이 수준 아래의 한 수준은 이러한 인터페이스를 구현하는 실제 클래스입니다. 이들은 위에서 설명한 Acme4680Sensor와 유사한 하나의 장치를 나타냅니다. 장치가 여러 기능을 수행 할 수 있으면 특정 클래스가 여러 인터페이스를 구현할 수 있습니다.

각 장치 클래스에는 하드웨어와 통신하는 저수준 작업을 처리하는 자체 개인 통신 (통신) 클래스가 있습니다.

하드웨어 모듈 외부에서 볼 수있는 유일한 계층은 인터페이스 / 열과 HardwareManager입니다. HardwareManager 클래스는 디바이스 클래스의 인스턴스화, 인스턴스 캐싱 ( 실제로 두 개의 디바이스 클래스가 동일한 하드웨어 디바이스와 통신하는 것을 원하지 않음) 등 을 처리하는 팩토리 추상화입니다 . 특정 유형의 센서가 필요한 클래스는 HardwareManager에 가져 오기를 요청합니다. 특정 열거 형의 장치로, 이미 열거되어 있는지 여부와 장치를 만들고 초기화하는 방법이 아닌지 알아냅니다.

여기서 목표는 비즈니스 로직을 낮은 수준의 하드웨어 로직에서 분리하는 것 입니다. 센서 데이터를 화면에 인쇄하는 코드를 작성할 때 해당 코드가 이러한 분리가 있고 하드웨어 인터페이스를 중심으로하는 경우에만 어떤 유형의 센서를 관리하지 않아야합니다 .


이 답변에 설명 된 디자인을 보여주는 UML 클래스 다이어그램 예

참고 : 다이어그램이 화살표 수프로 바뀌 었으므로 HardwareManager와 내가 그리지 않은 각 디바이스 클래스 사이에는 연관이 있습니다.


매우 흥미로운 답변입니다. 빠른 편집을 요청합니다. 언급 한 4 가지 클래스 간의 상속 / 컨테이너 / 협업이 무엇인지 더 명확하게 남겨 두십시오. 대단히 감사합니다!
heltonbiker

UML 클래스 다이어그램을 추가했습니다. 도움이 되나요?

2
나는 이것이 살인자 라고 말하고 많은 도움이 될뿐만 아니라 앞으로 더 많은 사람들을 도울 수 있다고 생각합니다. 게다가, 당신이 제공하는 클래스 계층 예제는 우리의 문제 및 솔루션 도메인을 현저히 잘 보여줍니다. 다시 한번 감사합니다!
heltonbiker

내가 질문을 읽을 때 나는 더 많은 일이 일어나고 있음을 깨달았으므로 약간 과잉 행동하고 전체 디자인을 공유했습니다. 이름은 디자인을 나타 내기 때문에 단순한 이름 지정 문제 이상입니다. 나는 이런 방식으로 구축 된 시스템으로 작업했으며 꽤 잘 작동했습니다.

11

이러한 클래스는 여러 네임 스페이스에 분산되어 있기 때문에 단일 통합 규칙을 찾는 것이 약간 어려울 수 있습니다.ConnectionInfoCrystalDecisionsDeviceInfo에 있는 것 같습니다 System.Reporting.WebForms).

그러나 이러한 예를 보면 접미사를 두 가지 뚜렷하게 사용하는 것 같습니다.

  • 정적 메소드를 제공하는 클래스와 인스턴스 메소드를 제공하는 클래스를 구별합니다. 이것은 경우입니다System.IO 같은 자신의 설명에 의해 밑줄 클래스 :

    디렉토리 :

    디렉토리 및 서브 디렉토리를 작성, 이동 및 열거하기위한 정적 메소드를 노출합니다. 이 클래스는 상속 될 수 없습니다.

    디렉토리 정보 :

    디렉토리 및 서브 디렉토리를 작성, 이동 및 열거하기위한 인스턴스 메소드를 노출합니다. 이 클래스는 상속 될 수 없습니다.

    Info 여기에서 약간 이상한 선택처럼 보이지만 차이점을 비교적 명확하게 만듭니다. Directory 클래스는 특정 디렉토리를 합리적으로 나타내거나 상태를 유지하지 않고도 일반적인 디렉토리 관련 도우미 메소드를 제공 DirectoryInfo할 수 있지만 실제로는 전직 일 수 있습니다.

  • 클래스가 정보 만 보유하고 행동을 제공하지 않음을 강조 접미사 이름에서 합리적으로 예상되는 을 .

    나는 그 문장의 마지막 부분이 구별이 말을하는 퍼즐의 조각이 될 수 있다는 생각 ConnectionInfo에서 EmployeeInfo. I 클래스라는이 있다면 Connection, 나는 합리적으로 연결이 내가 좋아하는 방법을 찾고있을 것 has- 것을 실제로 기능으로 날을 제공하기 위해 기대 void Open()하지만, 그들의 권리 염두에두고 아무도 기대하지 않을 것이다 등일 그 Employee클래스가 실제로 수 진짜이 일을 Employee하지, 나 같은 방법을 찾아 void DoPaperwork()bool TryDiscreetlyBrowseFacebook().


1
대답 해 주셔서 감사합니다! 나는 대답의 첫 번째 글 머리 기호가 .NET 클래스에서 일어나는 일을 분명히 설명한다고 생각하지만 두 번째 글씨는 의도 된 추상화를 더 잘 나타 내기 때문에 더 많은 가치를 지니고 있습니다 (사용 방법과 비교). 설명 할 것. 어떤 답변을 수락할지 선택하기가 어려웠습니다.
heltonbiker

4

일반적으로 Info객체 는 특정 시점에 객체 상태 대한 정보를 캡슐화합니다 . 시스템에 파일을보고 파일 FileInfo크기와 관련된 객체를 제공하도록 요청하면 해당 객체가 요청을 받았을 때 파일의 크기를보고 할 것입니다 (보다 정확하게는 호출 시점과 리턴 시점 사이의 순간에 파일). 요청의 반환 시간과 FileInfo객체 검사 시간 사이에 파일 크기가 변경되면 해당 변경 사항이 객체에 반영 되지 않을 것으로 예상됩니다 FileInfo.

이 동작은 File개체 의 동작과 매우 다릅니다 . 비 독점 모드에서 디스크 파일 열기 요청 FileSize속성 을 가진 객체를 생성하는 경우 File객체가 단순히 상태를 나타내는 것이 아니기 때문에 디스크 파일의 크기가 변경되면 반환 된 값이 변경 될 것으로 예상합니다. 파일- 파일 자체를 나타냅니다 .

대부분의 경우 서비스에 더 이상 필요하지 않은 경우 리소스에 연결된 개체를 정리해야합니다. 때문에 *Info객체가 자원에 첨부하지 않는, 그들은 정리를 필요로하지 않습니다. 결과적으로 Info객체가 클라이언트의 요구 사항을 충족시키는 경우 기본 리소스를 나타내지 만 해당 리소스에 대한 연결을 정리해야하는 객체를 사용하는 것보다 코드를 사용하는 것이 좋습니다.


1
이것은 정확하지는 않지만 File클래스를 인스턴스화 할 수 없으며 FileInfo객체 기본 파일 시스템으로 업데이트 되므로 .NET의 명명 패턴을 잘 설명하지 못하는 것으로 보입니다 .
Nathan Tuggy

@NathanTuggy 나는 이것이 .NET 의이 명명 규칙과 관련이 없다는 것에 동의하지만 현재의 문제와 관련하여 매우 관련이 있고 일관된 솔루션을 유도 할 수 있다고 생각합니다. 나는이 답변을
찬성했지만

@NathanTuggy : .NET을 어떤 종류의 일관성 모델로 사용하지 않는 것이 좋습니다. 많은 좋은 아이디어를 캡슐화하는 훌륭하고 유용한 프레임 워크이지만 몇 가지 나쁜 아이디어가 혼합되어 캡처됩니다.
supercat

@ 슈퍼 캣 : 물론; ".NET은 왜 이런 일을합니까?" "% THIS_WAY % 일을하는 것이 좋습니다."
Nathan Tuggy

@NathanTuggy : 문제의 클래스의 정확한 내용을 기억하지 못했지만 FileInfo정적으로 캡처 된 정보를 가지고 있다고 생각했습니다 . 그렇지 않습니까? 또한 비 독점 모드로 파일을 열 수있는 기회는 없었지만 가능해야하며 여는 데 사용 된 객체가 아닌 경우에도 파일의 현재 크기를보고하는 방법이있을 것으로 기대합니다 라고 File(일반적으로 그냥 사용 ReadAllBytes, WriteAllBytes, ReadAllText, WriteAllText, 등).
supercat

2

실제 장치 (센서 및 수신기)를 고려하는 것은 한 가지이며 소프트웨어에서 표현 이 다른 것도 "Info"접미사 이름 패턴으로 일부 클래스의 이름을 지정하려고합니다.

예를 들어, a Sensor는 실제 센서를 나타내는 클래스이지만 (실제로 일부 작동 장치에 연결된 경우) SensorInfo해당 센서의 특성 만 나타내는 데 사용됩니다. 예를 들어 파일을 저장할 때을 직렬화하는 SensorInfo대신 파일 헤더에 a를 직렬화하면 Sensor이해할 수 없습니다.

나는이 구별이 마음에 들지 않습니다. 모든 객체는 "소프트웨어의 표현"입니다. 그것이 "개체"라는 단어의 의미입니다.

이제 주변 장치에 대한 정보를 주변 장치와 인터페이스하는 실제 코드와 분리하는 것이 좋습니다. 예를 들어 센서에는 센서가 있습니다. 센서 정보에는 하드웨어가 필요없는 일부 메소드와 함께 대부분의 인스턴스 변수가 포함되어 있으며 센서 클래스는 실제 센서와 실제로 상호 작용합니다. 당신은 가지고 있지 않습니다Sensor 컴퓨터에 센서를하지 않는 한,하지만 당신은 그럴듯이-A를 수 있습니다 SensorInfo.

문제는 이런 종류의 디자인을 거의 모든 클래스로 일반화 할 수 있다는 것입니다. 따라서 조심해야합니다. SensorInfoInfo예를 들어 수업 이 없을 것 입니다. 그리고 Sensor변수 가 있다면 , 자신 과 상호 작용하여 Demeter법칙을 위반하는 것을 알 수 있습니다SensorInfo 회원. 물론 이것도 치명적이지는 않지만 API 디자인은 라이브러리 제작자만을위한 것이 아닙니다. 자신의 API를 깨끗하고 단순하게 유지하면 코드를 유지 관리하기가 더 쉬워집니다.

제 생각에 디렉토리와 같은 파일 시스템 리소스는이 가장자리에 매우 가깝습니다. 로컬로 액세스 할 수없고 사실이 아닌 디렉토리를 설명하려는 상황이 있지만, 일반 개발자는 이러한 상황 중 하나에 있지 않을 수 있습니다. 이런 식으로 수업 구조를 복잡하게 만드는 것은 도움이되지 않습니다. 대조적 인 파이썬의 접근 방식 pathlib: "필요한 것"인 단일 클래스와 대부분의 개발자가 안전하게 무시할 수있는 다양한 보조 클래스가 있습니다. 그러나 실제로 필요한 경우 구체적인 방법을 제외하고 거의 동일한 인터페이스를 제공합니다.


귀하의 답변에 감사드립니다. "have-a"구문에 대한 의견;) 귀하의 답변은 "DTO"(데이터 전송 객체) 개념 또는 매개 변수 객체 형제에 의해 발생하는 불편 함을 상기시킵니다. 일반적으로 메소드를 포함하지 않기 때문에 더 많은 정통 OO zealots에 의해 (결국 데이터 전송 오브젝트 임). 그런 의미에서 다른 사람들이 말한 것을 요약 SensorInfo하면 실제 Sensor객체 의 데이터 / 상태 부분 만 나타내는 DTO, 그리고 / 또는 "스냅 샷"또는 "스펙"과 같은 것이라고 생각 합니다. "아직도 없을 수도 있습니다".
heltonbiker

대부분의 디자인 문제와 마찬가지로 어렵고 빠른 규칙은 없습니다. 내가 제공 한 pathlib 예제 PureWindowsPath에서 Info 객체와 약간 비슷하게 작동하지만 Windows 시스템이 필요하지 않은 작업 (예 : 하위 디렉토리 가져 오기, 파일 확장자 분리 등)을 수행하는 메소드가 있습니다. 이것은 영광스러운 구조체를 제공하는 것보다 더 유용합니다.
Kevin

1
다시 한 번, "glorified struct"부분에 대한 찬사 :). 이것은 Bob 삼촌의 "Clean Code"책 6 장 : "성숙한 프로그래머들은 모든 것이 하나의 객체라는 생각을 알고 있습니다. 때때로 당신은 실제로 그것들이 작동하는 간단한 데이터 구조를 원합니다."
heltonbiker

2

우리는 높은 수준의 비즈니스 로직 코드와 낮은 수준의 모델, 아키텍처 구성 요소 등을 가지고 있기 때문에 컨텍스트 / 도메인이 중요하다고 말할 것입니다 ...

'정보', '데이터', '관리자', '객체', '클래스', '모델', '컨트롤러'등은 모든 개체에 정보 또는 데이터가 있기 때문에 특히 낮은 수준에서 냄새가 나는 접미사 일 수 있습니다. 그 정보는 필요하지 않습니다.

비즈니스 도메인의 클래스 이름은 이상하게 들리거나 100 % 정확한 언어가 아니더라도 모든 이해 관계자가 이야기하는 것과 같아야합니다.

데이터 구조의 좋은 접미사는 'List', 'Map'및 힌트 패턴 'Decorator', 'Adapter'(필요한 경우)입니다.

센서 시나리오에서 SensorInfo센서가 무엇인지 저장하지는 않지만 SensorSpec. Infoimho는 FileInfo크기와 같은 것과 같은 파생 정보입니다. 저장하지 않거나 경로와 파일 이름 등으로 작성된 파일 경로 등

다른 요점 :

Computer Science에는 캐시 무효화 및 이름 지정 작업이라는 두 가지 어려운 작업 만 있습니다.

-필 칼튼

그것은 항상 나에게 몇 초 동안 이름에 대해 생각 나게하고 아무것도 찾지 못하면 이상한 이름을 사용하고 'TODO'표시합니다. IDE가 리팩토링 지원을 제공하므로 나중에 언제든지 변경할 수 있습니다. 좋은 회사 슬로건이 아니라 원하는 때마다 변경할 수있는 코드 만 있습니다. 명심하십시오.


1

ThingInfo는 Thing에 대한 훌륭한 읽기 전용 프록시 역할을 할 수 있습니다.

참조 http://www.dofactory.com/net/proxy-design-pattern를

프록시 : "다른 개체가 액세스를 제어 할 수 있도록 대리 또는 자리 표시자를 제공합니다."

일반적으로 ThingInfo에는 setter가없는 공용 속성이 있습니다. 이러한 클래스와 클래스의 메서드는 사용하기에 안전하며 백업 데이터, 개체 또는 다른 개체에 대한 변경 내용을 커밋하지 않습니다. 상태 변경이나 다른 부작용은 발생하지 않습니다. 보고 및 웹 서비스 또는 개체에 대한 정보가 필요하지만 실제 개체 자체에 대한 액세스를 제한하려는 모든 위치에 사용할 수 있습니다.

가능하면 ThingInfo를 사용하고 실제 Thing 사용을 실제로 Thing 오브젝트를 변경해야하는 시간으로 제한하십시오. 이 패턴을 사용하는 데 익숙해지면 읽기와 디버깅이 훨씬 빨라집니다.


우수한. 오늘 초, 나는 질문에 사용한 수업에 관한 건축 적 요구를 분석 하고이 같은 결론에 도달했습니다. 제 경우에는 Receiver많은로부터 데이터 스트림을 수신 하는 것이 Sensor있습니다. 아이디어는 수신기가 실제 센서를 추상화해야한다는 것입니다. 그러나 문제는 : 센서 정보 가 필요 하므로 파일 헤더에 쓸 수 있습니다. 해결책 : 각각 IReceiver의 목록이 SensorInfo있습니다. 센서 상태 변경을 의미하는 명령을 수신기로 보내면 이러한 변경 사항이 해당 게터에 (게터를 통해) 반영됩니다 SensorInfo.
heltonbiker

(계속 ...) 즉, 센서 자체와 대화하지 않고 상위 레벨 명령을 통해 수신기와 만 대화하고 수신기는 차례로 각 센서와 대화합니다. 그러나 결국 센서의 정보가 필요합니다.이 정보는 List<SensorInfo>읽기 전용 속성을 통해 Receiver 인스턴스에서 가져옵니다 .
heltonbiker

1

지금까지이 질문에 아무도이 명명 규칙의 실제 이유를 알지 못하는 것 같습니다.

A는 DirectoryInfo아니다 디렉토리. 디렉토리 에 대한 데이터 가 있는 DTO입니다 . 동일한 디렉토리를 설명하는 많은 인스턴스가있을 수 있습니다. 엔티티가 아닙니다. 버리기 가치 객체입니다. A 는 실제 디렉토리를 나타내지 않습니다. 디렉토리의 핸들 또는 컨트롤러로 생각할 수도 있습니다.DirectoryInfo

이라는 클래스와 대조하십시오 Employee. 이것은 ORM 엔티티 오브젝트 일 수 있으며 해당 직원을 설명하는 단일 오브젝트입니다. ID가없는 값 객체 인 경우을 호출해야합니다 EmployeeInfo. 는 Employee참으로 실제 직원을 대표 않습니다. 가치와 같은 DTO 클래스 EmployeeInfo는 직원을 분명히 나타내는 것이 아니라 설명하거나 직원에 대한 데이터를 저장합니다.

BCL에는 실제로 두 클래스가 모두 존재하는 예가 있습니다. A ServiceController는 Windows 서비스를 설명하는 클래스입니다. 각 서비스마다 이러한 컨트롤러가 얼마든지있을 수 있습니다. A ServiceBase(또는 파생 클래스) 실제 서비스이며 개별 서비스마다 여러 인스턴스를 갖는 것이 개념적으로 의미가 없습니다.


이것은 Proxy@Shmoken이 언급 한 패턴 과 비슷하게 들립니까?
heltonbiker

@heltonbiker 반드시 프록시 일 필요는 없습니다. 설명 된 것과 어떤 방식으로도 연결되지 않은 개체 일 수 있습니다. 예를 들어 EmployeeInfo웹 서비스에서 얻을 수 있습니다 . 프록시가 아닙니다. 또한 예 :이 AddressInfo도하지 않습니다 주소 엔티티 없습니다 때문 프록시 할 수있는 일을. 독립형 가치입니다.
usr

1
알겠습니다.
heltonbiker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.