2013-07-23 4 views
0

개인 메서드를 통해 데이터를 수정해야하는 경우 클래스의 코드를 구성하는 가장 좋은 방법은 무엇입니까?클래스 코드를 올바르게 구성하는 방법은 무엇입니까?

private String data1; 

callMethod(data1); 

private void callMethod(String stuff) { 
    // Do stuff to data1 
} 

또는이 : 예를 들어

은 더 나은이 작업을 수행하는 것입니다

나는 다양한 방법으로 수행하고 내가 무엇을 이해하기 위해 노력하고있어 본 적이
private String data1; 

callMethod(); 

private void callMethod() { 
    // Do stuff to data1 
} 

제가 개발 도상국가에 처음 온 이래로 업계 표준 모범 사례입니다.

+1

첫 번째는 함수에서 변경하면 data1이 그대로 유지되고 두 번째는 원본을 변경합니다. 그래서 그것은 당신이 원하는 것에 달려 있습니다. – Tdelang

+0

@Tdelang 두 번째 방법은'data1'을 재 할당하지 않으면 반드시'data1'을 변경할 필요가 없습니다. – Thomas

+0

죄송합니다. 아마도 "기능을 변경 한 경우"로 다시 지정하는 것이 좋습니다. – Tdelang

답변

3

데이터가 개체에 비공개 인 경우 메서드에 데이터에 대한 모든 권한이 있습니다. 그것을 넘겨서는 안됩니다.

객체는 상태와 동작을 단일 소프트웨어 모듈로 캡슐화합니다. 작업은 상태를 조작해야합니다.

+0

이론적으로 사적 방법은 일반적으로 논쟁을하지 않습니다? –

+0

이것이 100 % 정확한지 확실하지 않습니다. 만약 두 개의 필드가있는 클래스가 있다면 'amount1'과'amount2'라고 말하며 양쪽 모두 같은 연산을 수행해야합니다. 인자를 가진 private 메소드를 사용할 수 있습니다. 그는 공개 방법이 아닌 개인적인 방법에 대해서 이야기하고 있습니다 –

1

이 인수가 클래스 private 멤버라는 사실을 알고있는 경우 인수가있는 private 함수를 작성하는 지점이 표시되지 않습니다. 함수가 구체적이고 결과가 멤버 상태에 따라 다르면 항상 두 번째 옵션을 사용합니다.

1

정말 데이터, 방법 및 수행하려는 작업에 따라 다릅니다. 다시 말해 이것은 클래스의 디자인의 일부입니다.

이 개인 메서드가 데이터를 수정하는 방법은 무엇입니까? data1 필드에 대해서만 의미가있는 특정 계산을 수행하는 경우 callMethod()을 사용하면됩니다.

반면에 callMethod() 아마도 (아마도 같은 계산은 두 개의 서로 다른 필드 data1data2에서 수행 할 수 있습니다) 클래스 안에 작은 유틸리티 인 경우는 두 개의 별도의 방법을 가지고 있지만에 회원을 통과하지하는 것이 합리적이다 인수로 수정 ​​될 수있다. 특정 예를 들어이있는 경우

우리는 아마도 더 많은 도움

1

그것은 방법은 이미 액세스 할 수있는 회원을 알고 있다면 내부적으로 참조를 전달하는 말도 안돼을 제공 할 수있다.

class FooHolder { 
    private Foo foo; 

    private void ensureInitialized() { 
     if (foo == null) 
      foo = new Foo(); 
    } 

    public Foo getFoo() { 
     ensureInitialized(); 
     return foo; 
    } 
} 

그러나 코드 중복을 방지 할 수 있다면 그렇게하는 것이 유용 할 때가 있습니다. 그 내부 유틸리티 메소드는 때때로 여기처럼 정적이 될 수 : 때때로

class FooAndBar { 
    private List<Foo> foos; 
    private List<Bar> bars; 

    public void addFoo(Foo foo) { 
     foos = ensureList(foos); 
     foos.add(foo); 
    } 

    public void addBar(Bar bar) { 
     bars = ensureList(bars); 
     bars.add(bar); 
    } 

    // assume this method is not generically useful and therefore not better off in a utility class 
    private static <T> List<T> ensureList(List<T> list) { 
     return list != null ? list : new ArrayList<T>(); 
    } 
} 

그들이 할 수없는/getListForKeyfooMap에 대한 참조를 전달되지 않습니다 것을

class FooFoos { 
    private final Map<String, List<Foo>> fooMap = new HashMap<String, List<Foo>>(); 
    private List<Foo> getListForKey(String key) { 
     List<Foo> list = fooMap.get(key); 
     if (list == null) { 
      list = new ArrayList<Foo>(); 
      fooMap.put(key, list); 
     } 
     return list; 
    } 

    public void addFoo(String key, Foo foo) { 
     getListForKey(key).add(foo); 
    } 
    public List<Foo> getList(String key) { 
     return getListForKey(key); 
    } 
} 

참고해서는 안됩니다. 그 부분이 이미 명확하고 모든 메소드에서 타이핑하면 코드가 복잡해지기 때문에 불필요하지 않습니다.

코드 중복을 줄이고 내부 캡슐화를 수행 할 수 있다면 개인 메서드에 대한 참조를 전달하십시오. 모든 메소드가 참조를 다시 지정해야하기 때문에 더 많은 코드가 생성된다면 그렇게하지 마십시오.

메소드를 통한 기능의 내부 캡슐화가 많다는 것은 해당 기능을 다른 클래스로 리팩토링하는 것을 고려해야한다는 것을 의미합니다.마지막 예제는 다음과 같이 작성/사용하는 것을 고려하십시오. MultiMap

+0

이 답변에 많은 감사를드립니다! 그것은 나를 위해 많은 것을 정리했다. –

관련 문제