2010-12-24 4 views
2

나는 종종 유사한 패턴을 건너 :이 클래스 + 생성자 정의 패턴이 지나치게 중복 되었습니까?

class Person { 
    public string firstName, lastName; 
    public Person(string firstName, string lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 
} 

이 지나치게 중복 느낌 (나는 ... 충분히있을 수 대신에 세 번 중 한 번 "firstName을"를 입력 상상),하지만 적절한 생각할 수 없다 대안. 어떤 아이디어? 어쩌면 나는 여기에 사용해야하는 특정 디자인 패턴에 대해서 모른다.

편집 - 조금 더 자세히 설명해야한다고 생각합니다. 예제 코드를 "더 좋게"만드는 방법을 묻는 것이 아니라 "더 짧게"만드는 방법을 묻습니다. 현재 상태에서는 모든 멤버 이름이 네 번 (선언, 초기화, 생성자 인수)으로 나타나며 다소 중복됩니다. 그래서 (거의) 같은 동작을 얻을 수있는 패턴 (또는 의미 설탕)이 있는지 궁금 해서요. 그러나 팽창은 적습니다.
처음에 불분명 함을 사과드립니다.

편집 - Dave의 C# 3.0 초기화 예제는 꽤 좋지만 좀 더 일반적인 대답을 기대합니다. :)

편집 - 이제는 특정 언어가 덜 자세한 구현을 허용한다는 것을 알았습니다. Java와 C#은 그렇지 않을 수도 있습니다.

+2

이름 및 성이 공개되어가? 누가이 코드를 썼습니까? –

+1

질문의 목적은 중요하지 않습니다. 나는 의도적으로 그것을 가능한 한 간단하게 만들었다. –

답변

1

일반적인 패턴은 아마도 "좋은 프로그래밍 언어 사용"입니다. 당신은 동일한 기능을 얻기 위해 자바로 작성해야 무엇을보고

class Person(var firstName: String, var lastName: String) 

당신은 생성 된 Person.class 파일을 통해 자바 디 컴파일러를 실행할 수 있습니다 : 예를 들어, 스칼라의 한 줄은 당신이 위에 쓴 것과 거의 비슷하다 :

public class Person { 
    private String firstName, lastName; 

    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String paramString) { 
     this.firstName = paramString; 
    } 

    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String paramString) { 
     this.lastName = paramString; 
    } 

    public Person(String firstName, String lastName) { 
     setFirstName(firstName); 
     setLastName(lastName); 
    } 
} 

방법 이름은 (대신 getFirstName의 그것은 자바에서 불법이기 때문에 setFirstName 스칼라, 그냥 firstNamefirstName_= 차례로 firstName_$eq로 인코딩됩니다있는 후자를 사용) 약간 다를 수 있지만 의도는 똑같다.

클래스를 case class으로 만들 수 있다면 equalshashCode에 대한 적절한 구현도 자동으로 생성됩니다.

Person = Struct.new(:first_name, :last:name) 

을 다시 당신이 자바의 예에서 얻을 것이 무엇 상당히 비슷한 얻을 :

루비, 당신은 작성합니다. Struct.new 실제로이 같은 약 보이는 적절한 수준의 합성한다 : 일부 언어가 장황 할 수 있도록 설계되어

class Person 
    attr_accessor :first_name, :last_name 

    def initialize(first_name, last_name) 
    self.first_name, self.last_name = first_name, last_name 
    end 
end 
4

개체를 만들 때 어떤 값을 설정하려고하는지, 그리고 특정 값 인지 여부에 따라 달라집니다.

당신은 당신이했던 것처럼 건설에 설정 개최 값이 다음 클래스를 선언해야합니다 : 특성은 다음 당신은 또한 한 구성에 설정 몇 가지 요구 사항이 있다면

class Person 
{ 
    public string FirstName { get; private set; } 
    public string Surname { get; private set; } 

    public Person(string firstName, string surname) 
    { 
     // properties are read-only so must be set as part of the constructor 
     this.FirstName = firstName; 
     this.Surname = surname; 
    } 
} 

당신이 한 것처럼 클래스를 정의 할 수 있습니다. 그러나 나중에 해당 값을 변경할 수도 있습니다.

class Person 
{ 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 

    public Person(string firstName, string surname) 
    {    
     this.FirstName = firstName; 
     this.Surname = surname; 
    } 
} 

속성은 언제든지 설정할 수있는 경우, 즉 그들이 다음 생성자의 일부로에서 통과 할 필요가 없습니다, 창조에 설정하고 있는지 선택 사항입니다.

class Person 
{ 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 

    public Person() 
    { 
    } 
} 
C#에서

(3 이상) 여전히 작성 중에 그 속성을 설정할 수 있습니다,하지만 난 다른 언어가이를 반영 할 수있는 기능을 모르겠어요 :

var myPerson = new Person 
{ 
    FirstName = "Test", 
    Surname = "Test2", 
}; 

예 모두에 C#하지만 일반적으로 진정한 OOP를 개최해야합니다.

+0

+1, "이 값은 나중에 변경할 수 있습니다." –

1

예제 코드를 "더 좋게"만드는 방법을 묻는 것이 아니라 "더 짧게"만드는 방법을 묻습니다. 현재 상태에서는 모든 멤버 이름이 네 번 (선언, 초기화, 생성자 인수)으로 나타나며 다소 중복됩니다. 그래서 (거의) 같은 동작을 얻을 수있는 패턴 (또는 의미 설탕)이 있는지 궁금 해서요. 그러나 팽창은 적습니다.

내가 알고있는 디자인 패턴이 실제로는 없지만이 반복이 얼마나 많이 필요한지는 언어에 따라 크게 다릅니다.

예를 들어, 스칼라, 당신이 경우 클래스로이 문제를 정의하고, 모든 반복 잃을 수 :

case class Person(firstName: String, lastName: String) 

마찬가지로를, 루비, 당신은 속성 접근자를 사용하여 클래스 정의는 매우 짧은 할 수 있습니다 :

class Person 
    attr_accessor :first_name, :last_name 
end 

이들 중 어느 것도 설명 된 내용과 정확하게 동일하지 않으며 변경 가능한 개체를 정의하는지 또는 초기화할지 여부가 달라집니다. 그러나 이러한 중복성은 언어에 따라 결정됩니다.

0

을, 그들은 일반적으로 당신이 그 문제를 해결하는 것을 허용하지 않습니다.

Java는 유형 선언이 나오기 만하면 상태가 될뿐만 아니라 분명히 반복해야합니다. 타입 유추는 스칼라와 같은 언어를 사용하고자한다면 대부분이를 고칠 수 있습니다. 당신도 정적 유형이나 수업을

자바 스크립트에서

, 생성자 객체를 생성하고 같이하는 것과 기능은 다음과 같습니다

function Person(firstName, lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
} 
관련 문제