상태가없는 인스턴스화 가능한 클래스가 너무 많은 이유는 무엇입니까?


18

C ++ 및 Java 세계에서 상태가없는 많은 인스턴스화 가능한 클래스를보고 있습니다.

사람들이 왜 그렇게하는지 알 수 없습니다 .C ++에서 무료 함수가있는 네임 스페이스를 사용하거나 개인 생성자가 있고 클래스가 Java 인 클래스 만 사용할 수 있습니다.

내가 생각할 수있는 유일한 이점은 나중에 특정 상황에서 다른 구현을 원한다고 결정하면 대부분의 코드를 변경할 필요가 없다는 것입니다. 그러나 이것이 조기 설계의 경우가 아닙니까? 필요할 때 / 나중에 수업이 될 수 있습니다.

내가 잘못하고 있습니까? 모든 것을 객체 (즉 인스턴스화 된 클래스)에 넣지 않으면 OOP가 아닙니까? 그렇다면 왜 C ++과 Java의 표준 라이브러리에 유틸리티 네임 스페이스와 클래스가 그렇게 많은가?

업데이트 : 필자는 이전 작업 에서이 예제를 많이 보았지만 오픈 소스 예제를 찾는 데 어려움을 겪고 있으므로 결국 그렇게 일반적이지 않을 수 있습니다. 아직도, 나는 사람들이 왜 그것을 하는가, 그리고 그것이 얼마나 흔한 지 궁금합니다.


2
"매우 일반적"을 수량화하지 않고 대답하기 어렵다. 나는 그것을 자주 본다고 말할 수 없다. Q를 "ivar이없는 클래스는 어떻게 유용합니까?"와 같은 것으로 변경하십시오.
Caleb

@Caleb 저는 오픈 소스 프로젝트에서 예제를 찾아 볼 것입니다. 내가 일한 Java 상점에서 확실히 많이 보았습니다.
futlib

@ futlib : 예, 일반적입니다. stackoverflow.com/questions/4692845/…
Hoàng Long

예를 들어 클래스 만 포함한다고 생각하십니까? EntityManager에 상태가 포함되어 있지 않습니까?
user470365

답변:


22

C ++ 및 Java 세계에서 상태가없는 많은 인스턴스화 가능한 클래스를보고 있습니다.

자체 ivar없이 클래스를 작성해야하는 몇 가지 가능한 이유 :

  • 상태는 슈퍼 클래스에 있거나 포함될 수 있습니다.

  • 클래스는 일부 인터페이스를 구현 하며 인스턴스를 다른 객체로 전달할 수 있도록 인스턴스화 할 수 있어야합니다.

  • 클래스는 서브 클래스로 만들어졌습니다.

  • 관련 기능을 그룹화하는 편리한 방법입니다. (예, 동일하거나 더 나은 방법이있을 수 있습니다.)

내가 잘못하고 있습니까? 모든 것을 객체 (즉 인스턴스화 된 클래스)에 넣지 않으면 OOP가 아닙니까?

OOP는 자연의 법칙이 아니라 패러다임입니다. 모든 것이 대상인 언어 가 있으므로 선택의 여지가 없습니다. 다른 언어 (예 : C)는 OOP를 전혀 지원하지 않지만 객체 지향 스타일로 프로그래밍 할 수 있습니다. 수업에서 모든 것을 하지 않으면 OOP를 가질 수 있다고 말하고 싶습니다 .이 경우 OOP 가 다고 말할 수 있습니다 .


4

Caleb과 Robert Harvey는 이미 유틸리티 클래스가 무엇인지, 그리고 "데이터가없는"클래스가 필요한 합법적 인 이유를 지적했습니다. 이러한 설명은 명확하지만 긍정적 인 측면을 다룹니다.

나는 유틸리티 클래스 의 남용 이 분명히 OO 안티 패턴 일 수 있다고 언급하고 싶습니다 ( c2wiki의 설명 참조 ). 이 인용문을 잘 요약하면 다음과 같습니다.

이러한 클래스 (특히 단일 메서드 만있는 클래스)는 디자이너가 거꾸로 생각하고 있음을 나타냅니다. 객체에 의해 수행 될 수있는 것이 아니라 객체에 대해 수행 될 수있는 것을 생각하는 것.

객체 지향 디자인을 연습한다고 주장하지만 코드베이스가 거의 모든 유틸리티 클래스로 구성되어 있다면 분명히 뭔가 잘못하고 있다고 말하고 싶습니다. 이것을 말했지만, 기능적 접근 방식은 많은 장점을 가지고 있으며, 작업하기에도 우수 할 수 있습니다. 다른 사람을 반쯤 진심으로 구현하면서 하나를 따르고 있다고 주장하지 마십시오.


2

Java 및 C ++의 유틸리티 클래스는 하나 이상의 입력 매개 변수를 사용하고 결과를 리턴하는 메소드 라이브러리를 유지 보수하는 데 사용됩니다. 단순히 값을 반환하면 상태를 유지할 필요가 없습니다. 이와 관련하여, 이들 방법은 모든 장점을 갖는 기능성 프로그래밍의 조잡한 형태로 간주 될 수있다 (한 가지에 대한 동시성에 대한 문제 없음).

어쨌든 이러한 클래스는 관련 컨테이너를 단일 컨테이너에 그룹화하는 데 사용됩니다. 객체를 제대로 인스턴스화하지 않아도되는 메소드입니다. 이러한 클래스의 예로는 SINE 및 COSINE (및 기타 수학) 함수가 포함 된 Math 클래스가 있습니다.


2

이러한 클래스 중 다수는 명시 적으로 포함되어 있지 않더라도 데이터와 상호 작용하므로 여러 개의 동시 인스턴스를 활성화해야하는 방식으로 데이터를 처리해야합니다. 예를 들어 데이터베이스 저장 프로 시저와 상호 작용하여 들어오는 데이터를 일부 PL / SQL 패키지로 전달하고 결과를 호출 응용 프로그램으로 다시 전달하는 상태 비 저장 세션 Bean 그 일은 여러 인스턴스에 존재해야하지만 데이터 필드가 포함되어 있지 않습니다.


0

클래스가 객체가 아닌 객체 지향 언어에서는 클래스보다 객체로 더 많은 것을 할 수 있습니다.

객체를 매개 변수로 전달하고 형식 호환 객체를 대체 할 수 있으며 인터페이스를 구현할 수 있습니다 (클래스가 객체 인 언어가 있지만 이러한 작업 중 일부는 수행 할 수 있지만 어떤 경우에도 가능합니다 ...) . 이 모든 것은 매우 중요하므로 기본 결정은 일반적으로 클래스를 인스턴스화하는 것입니다.

일부 클래스의 경우 인스턴스화에 의해 부여 된 기능이 필요하지 않은 것 같습니다. 예를 들어 코사인 구현을 다른 구현으로 교체 할 필요는 없습니다. 대부분 이러한 기능이 필요하지 않은 유틸리티 함수이므로 인스턴스화 할 수없는 클래스가있는 유틸리티 함수입니다.

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