2010-06-13 2 views
5

Stackoverflow 사용자 : 많은 종류의 프로그램에서 기본 형식 인 또는을 사용하여 프로그램에서 표현할 수 있습니다. 새로운 클래스를 만들 수 있습니다.기본 유형 (정수, 문자열)을 언제 사용하고 새로운 클래스를 작성해야합니까?

예 : 사회 보장 번호는 숫자, 문자열 또는 자체 개체 일 수 있습니다.

(기타 일반적인 예 : 전화 번호, 이름, 우편 번호, 사용자 ID, 주문 ID와 다른 ID 년대.)

내 질문은 : 우리가 우리 자신를 작성해야 할 때 기본 유형을 사용해야하는 경우, 그리고 새로운 계급?

행동을 추가해야 할 때 클래스 (예 : 주민등록번호 구문 분석, 유효성 검사, 서식 지정 등)를 만들고 싶습니다. 하지만 이것이 유일한 기준입니까?

많은 것들이 자바 정수 및/또는 문자열로 표시되는 경우가 있습니다. 우리는 타입 체크의 이점을 잃어 버렸고, 종종 function(Intever, Integer, Integer, Integer)을 호출 할 때 매개 변수가 섞여 발생하는 버그를 보았습니다.

function(OrderId, ExternalOrderId, UserId, SalesManId) isntead를 사용하고 유형 확인의 이점을 누릴 수 없습니까?

분명히 대답은 "의존적"입니다. 하지만, 어떻게 생각하니, 평상시에 무엇을하나요?

+1

다음은 원하는 경우 원시 스타일을 클래스로 대체하는 방법에 대한 아이디어입니다. http://stackoverflow.com/questions/24981278/design-patterns-for-type-safe-integers – Morad

답변

2

"어떻게이 데이터를 저장할 수 있습니까?"보다는 "이 데이터를 어떻게 수행 할 수 있습니까?"라는 질문을하십시오.

몇 가지 예를 사용하십시오. SSN은 숫자이며 XXX-XX-XXXX 형식입니다. 이 값에 대한 사용자 입력 값을 읽으려면 형식을 올바르게 입력했는지 확인하기 위해 일종의 유효성 검사를 제공해야합니다. 양식에 3 개의 텍스트 상자와 같이 개별적으로 3 개의 숫자를 입력하는 방법을 제공 할 수도 있지만 내부적으로 SSN에 연결할 수 있습니다. String 클래스 또는 Integer를 단독으로 사용하는 것은 이러한 작업을 수행하는 방법을 제공하지 않으므로 고유 한 형식을 제공하고 유효한 값만 저장할 수 있도록하는 것이 좋습니다. 유형은 실제로 데이터를 보유하기 위해 내부적으로 또는 내부적으로 String을 가지지 만, 캡슐화 클래스는 유효한 방식으로 값을 읽고 쓸 수 있도록 보장합니다.

전화 번호, 우편 번호는 유효성을 검사 할 수있는 다른 영역이므로 사용할 수 있습니다.

UserIds는 시나리오에 따라 다르지만 일반적으로 기본 유형이면 충분합니다. 사용자 정수를 특정 숫자 범위로 제한해야하는 경우 (기본 Integer 유형의 범위와 다름) 클래스로 캡슐화 할 수 있습니다.

2

실제 실제 개체에 대해 여러 가지 공통 속성이 있고 이러한 속성을 조작하기위한 자세한 방법을 원할 경우 클래스를 사용하십시오. 한 가지 유형의 데이터 만 있고 고급 조작이 필요하지 않은 경우 프리미티브를 사용하십시오.

1

내장 된 유형이 사용자가 사용하는 용도에 맞는 것이면 특수한 클래스를 만들 필요가 없습니다. 변수의 데이터가 실제로 무엇을 의미하는지 명확하지 않으면 클래스를 만들어 명확하게 만들 수 있습니다.

예를 들어 전화 번호와 같은 값은 문자열로 잘 작동합니다.수치 적으로 수치이지만, 계산을하지 않으므로 함수에 대한 유효성 검사가 중요하지 않습니다. 단지 사용자가 말도 안되는 것을 막을뿐입니다.

거리와 같은 값은 클래스의 후보입니다. 거리를 저장하기 위해 정수 또는 double을 사용할 수 있지만, 변수 DistanceInMeters의 이름을 지정하는 것과 같은 값을 만들기 위해 더 많은 정보를 추가해야합니다. 거리를위한 클래스를 생성하여 사용을 제한하고, FromMeters 메서드를 생성자로만 제공하고, 값을 읽는 Meters 속성 만 제공 할 수 있습니다. 그런 식으로 가치가 무엇을 의미하는지 분명합니다.

+0

어떻게 든 당신의 예제는 나의 직감과는 정반대 인 것처럼 보입니다. 전화 번호는 많은 다른 포맷으로 올 수 있기 때문에 클래스가되어야합니다. 그리고 우리는 모든 사람들이 파싱 및 체크를 처리해야하는 것을 원하지 않습니다. 거리와 같은 변수를 사용할 때 손으로 직접 클래스를 만들 필요가 없다. 보통 변수 이름에 단위를 적어 둔다. (예 :'int commandTimeoutSec') – Morad

+0

@MoradAbdelrahman : 예, 그 방법은 당신은 그것을 구현하기를 원하지만 예제와는 관련이 없습니다. 그것들은 주변에 공감을 나타낼만한 예가 될 뿐이며, 관련성이있는 예에서는 추론입니다. – Guffa

1

트레이드 오프입니다. 기본 유형은 이해하기 쉽지만 맞춤 유형은 먼저 이해해야합니다. 사용자 정의 유형으로 선언 된 프로젝트 도메인의 주체 중 하나 여야합니다.

기준은 다음과 같습니다. 맞춤 유형의 가치가있는 경우 이미 해당 도메인에 해당하는 용어가 있습니다. 예를 들어 승객이있는 동안 "차를 운전하는 사람"을 "운전자"라고 부릅니다. 의료 영역에서는 모든 운전자와 승객이 인간이며 기준은 다른 것입니다.

0

해당 필드가 항상 다른 필드와 함께 사용되는 경우 논리적 그룹화가 적합합니다. 이것은 동일한 매개 변수 세트를 일관되게 취하는 메소드가있는 경우에 볼 수 있습니다.

필드를 논리 단위로 그룹화하면 논리 단위의 사용자가 논리 단위 자체를 추상화합니다. 이는 구현 세부 사항이 숨겨져있어 코드의 다른 영역에 영향을주지 않고 데이터의 기본 표현을 변경할 수 있음을 의미합니다.

해당 필드에서만 작동하는 기능이있는 경우이 필드를 클래스 후보로 간주합니다. 또한 유닛이 단순하지만 항상 같은 방식으로 사용되는 경우, 클래스로 만들고 해당 기능을 클래스에 넣는 것을 고려합니다. 이는 기능이 한 곳에서만 유지되므로 해당 동작을 변경하는 것이 쉬우 며 코드에 반복이 적게 포함됨을 의미합니다.

1

다중 인수 함수에 유형 안전성을 제공하는 것은 IMO가 실제로 어떤 기능을 가지고 있지 않은 클래스를 만드는 것이 가치가있는 경우입니다 (이점을 얻기 위해 코드에 충분한 함수가 있다고 가정 할 때).

명명 된 인수은 모든 언어에서 사용할 수 있지만 더 쉬운 솔루션입니다.

+0

질문을 한 지 오래되었지만 동일한 결론에 도달했습니다. 타입 안전성과 혼란을 피하는 것은 새롭고 작은 클래스를 소개 할 가치가 있습니다. – andrel

관련 문제