문제

나는 지금 이런 식으로 보이는 코드로 작업하고 있습니다

public String getName(User user) {
     user.setSth(...);
     return user.getName();
}

전달 된 객체를 매개 변수로 변경하는 것은 나쁜 관행이라고 생각합니다. 그런 종류의 코드를 감지하는 도구가 있습니까? FindBugs, PMD 및 CheckStyle을 보았지만이를 찾을 수 없었습니다.

추신 : 나쁜 예에 대해 죄송합니다.

도움이 되었습니까?

해결책

나는 당신이 이미 올바른 길을 가고 있다고 생각합니다. 이런 종류의 코드를 감지하는 가장 좋은 도구는 거의 확실합니다. FindBugs. 그러나이 패턴에 대해 자신의 탐지기를 작성해야 할 것입니다. 여기 예입니다 탐지기를 작성하는 방법에 대해서는 원하는 검출기가 아닙니다.

경고: 나는 부작용 getter가 항상 나쁜 스타일이라는 데 동의하지 않습니다. 그러나 당신이 정말로 그런 종류의 것을 찾고 싶다면 FindBugs를 추천합니다.

다른 팁

도구의 관점에서 "getName"및 "setsth"가 메소드 호출이기 때문에 아무것도 찾을 수 없습니다. 인간은 "이것은 getter"라고 말하고 "이것은 세터입니다"라고 말하지만 도구는 그렇지 않습니다. 실제로 Getters는 인수를 받아들이지 않기 때문에 getName ()는 Getter가 아닙니다.

따라서 메소드가 항상 객체를 변경하기 때문에 도구는 특이한 것을 볼 수 없습니다.

이 규칙을 시행하려면 FindBugs와 PMD를 확장하는 것을 살펴보십시오. 둘 다 추가 제약 조건을 정의 할 수 있습니다. 당신이 찾고있는 것은 아마도 다음과 같습니다.

  • 메소드 이름이 "get"으로 시작하는 경우
  • 및 메소드 바디 호출 모든 객체의 매개 변수로 전달되는 메소드

그런 다음 경고를 인쇄하십시오. 너무 오래 걸리지 않아야합니다. 이것을 실행하면 얼마나 많은 "거짓 긍정"을 얻을 수 있는지 볼 수 있습니다 (실제로 괜찮은 방법에 대한 경고). 이를 통해이를 더 추구 할 가치가 있는지 여부를 결정하는 데 도움이됩니다. 또한 CV에 추가 할 새 항목이 있습니다 :)

당신은 만들 수 있습니다 User 불변 (선언하십시오 final, 모든 속성을 선언하십시오 final 그리고 세터의 원격. 나는 그것이 어디에서나 실천하지 않지만 많은 곳에서 좋은 곳에서 다른 기능에 전달하는 데 아무런 문제가 없을 것입니다).

무언가를 "변경"해야하는 경우 다음과 같은 기능을 구현할 수 있습니다. newId 그 샘플에서 :

public final class User {
    private final String name;
    private final int id;

    User(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public User newId(int newId) {
        return new User(this.name, newId);
    }

    //getters here;
}

내장 String, Integer, ... 수업도 그렇게합니다.

"getters"만 포함하는 userview라는 인터페이스를 만들고 사용자가 구현하고 새 userview 인터페이스를 매개 변수 유형으로 사용 할 수 있습니다.

interface UserView{
 public String getName();
...

class User implements UserView...

public String getName(UserView user) {
     user.setSth(...); // Will not compile
     return user.getName();
}

실제로 이것은 C ++에서 const 예선. 매개 변수를 다음과 같이 정의합니다 const 그리고 해당 매개 변수의 경우 정의 된 메소드 만 호출 할 수 있습니다. const - 보통, getters.

Java에서 이것은 결석하고 솔직히 말해서, 나는 정말로 신경 쓰지 않습니다. 언급 했듯이이 동작을 확인할 수있는 소스 코드 분석기와 메타 프로그래밍 방법도이를 수행 할 수 있습니다.

개인적으로, 나는 그것을 믿는다 메소드의 이름이 올바르게 지정된 경우 개체를 전달하는 데 문제가 없으므로 수정되었습니다.

컴파일러보다 더 높은 수준에서 코드에 대해 "이유"를 "이유"할 수있는 도구가 있습니다. 예를 들어 선언적 메타 프로 그램은 다른 프로그램이 다른 프로그램이 특정 디자인을 준수하는지 또는 반대로 코드 냄새 및 반포를 위해 광산을 내릴 수 있는지 확인할 수있는 훈련입니다.

일부 링크 :

http://prog.vub.ac.be/dmp/

http://www.cs.bris.ac.uk/publications/pub_master.jsp?id=1000273

그리고 나머지는

http://www.google.com/search?num=100&hl=en&q=declarative+ metaprogramming

당신은 C ++에서 "const"와 같은 것을 찾고 있으며, 이는 매개 변수 값을 전달한 참조만큼 불변으로 만들 수있는 것을 시행 할 것입니다. 불변의 물체는 당신이 그들과 함께 살 수 있다면 보장합니다.

이와 같은 부작용은 사용자를 놀라게 할 수 있기 때문에 이것이 "나쁜"이라고 주장합니다. 그것은 유효하지만, 그것은 그것이 불필요한 놀라다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top