전달 된 객체의 변화 값을 매개 변수로 감지합니다
-
23-08-2019 - |
문제
나는 지금 이런 식으로 보이는 코드로 작업하고 있습니다
public String getName(User user) {
user.setSth(...);
return user.getName();
}
전달 된 객체를 매개 변수로 변경하는 것은 나쁜 관행이라고 생각합니다. 그런 종류의 코드를 감지하는 도구가 있습니까? FindBugs, PMD 및 CheckStyle을 보았지만이를 찾을 수 없었습니다.
추신 : 나쁜 예에 대해 죄송합니다.
다른 팁
도구의 관점에서 "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://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"와 같은 것을 찾고 있으며, 이는 매개 변수 값을 전달한 참조만큼 불변으로 만들 수있는 것을 시행 할 것입니다. 불변의 물체는 당신이 그들과 함께 살 수 있다면 보장합니다.
이와 같은 부작용은 사용자를 놀라게 할 수 있기 때문에 이것이 "나쁜"이라고 주장합니다. 그것은 유효하지만, 그것은 그것이 불필요한 놀라다.