속성 설정기에 논리를 추가하는 것은 나쁜 습관으로 간주됩니까?


28

나는 프로젝트에 뛰어 들었고 다른 개발자들이 합성 속성의 세터에 많은 논리를 추가하고 있음을 알았습니다. 나는 이것이 어떻게 작동하는지 이해하지만 프로그램의 흐름을 이해하기가 어렵다고 생각합니다. 코드를 읽는 동안 볼 때마다 self.something = whatever항상 something세터가 재정의 되었는지 확인합니다 .

이 주제에 대한 귀하의 의견은 무엇입니까? 이것이 잘못된 아키텍처 또는 정교한 솔루션의 표시라고 생각하십니까?

관련 링크 / 소스가있는 경우이 내용에 대해 더 자세히 읽어 보시기 바랍니다 .Google 검색 결과를 얻는 것이 너무 어려워서 여기에서도 질문하기로 결정했습니다.

답변을 주셔서 감사합니다. 태그를 보지 못한 경우 객관적 C에 대해 이야기하고 있습니다 (언어가 특정 언어 문제가 아니더라도).


5
어떤 종류의 논리? 예를 들어, 검증 로직을 넣는 데 아무런 문제가 없습니다. 반면에 몇 가지 이벤트를 전달하고 웹 서비스를 호출하며 UI를 업데이트하는 setter는 완전히 잘못되었습니다.
Arseni Mourzenko

@MainMa 나는 유효성 검사가 훌륭하다는 데 동의합니다. 아마도 일부 관찰자를 추가 할 수 있습니까? 세터에 넣기에 더 적절하다고 생각되는 몇 가지 예를 들어 주시겠습니까?
phi

실제로 관찰자는 옳습니다. 세터에게 적합한 것들에 관해서는 더 숙련 된 개발자들이이 질문에 대답하도록하겠습니다.
Arseni Mourzenko

답변:


44

속성 설정기에 논리를 추가하는 것은 나쁜 습관으로 간주됩니까?

아니

클래스 디자이너가 편리한 필드 액세스 및 할당 인터페이스에 로직을 연결할 수 있도록 속성이 개발되었습니다.

너무 많아요? 그것은 수업의 책임에 달려 있습니다. 속성 설정기에 넣을 수있는 몇 가지 사항은 다음과 같습니다.

  • 일부 파생 값을 업데이트
  • 관찰자에게 클래스 상태가 변경되었음을 알립니다
  • 포함 된 개체에 변경 사항을 전파
  • 변경 사항을 백업 저장소로 전파
  • 검증을 수행하다

호출자가 클래스의 수행 방식에 대해 생각하지 않고 클래스가 수행 할 수있는 작업을 명확하게하는 인터페이스가 클래스에 있으면 프로그래밍이 더 쉽습니다. 속성 설정자 뒤에 논리를 추가하면 클래스가 간단한 인터페이스 뒤에 구현을 숨길 수 있습니다. 일부 클래스의 경우 메소드가 필요하지 않습니다. 속성을 설정하여 노브를 돌리고 속성을 가져 와서 출력을 읽으십시오.


13
검증 수행 ...
Robert Harvey

setter 재정의 된 메소드에서 collectionview 또는 tableview를 다시로드하는 것이 얼마나 좋습니까?
Krishnan

15

세터 (setter)는 일반적으로 중대한 부작용이나 무거운 계산없이 개체의 상태를 변경하는 데 사용됩니다. setter 구현의 주된 이유 는 유효한 상태를 변경하고 유지하는 것 입니다. 따라서 범위를 제한하거나 재 계산을 요청하도록 플래그를 설정하거나 관련 속성을 조정하는 것이 좋습니다.


7

나는 객관적인 C에 대해 모른다. 그러나 당신이 말했듯이, 그것은 모든 OO 언어에 대한 일반적인 질문으로 보입니다. 우선 세터와 게터를 처음에 가질 지 여부는 토론의 문제입니다 (일부 경우 프레임 워크 또는 라이브러리를 사용하여 존재 여부를 정당화합니다).

나는 그 방법의 이름이 그 방법과 모든 방법이 무엇을하는지 설명해야한다고 믿는다. 또한 해당 방법과 관련된 설명서는보다 명시적인 방법으로 설명해야합니다. 이런 의미에서 "set"+ {noun} 형식의 메소드 이름에는 변수 값을 설정하는 것 외에 다른 부작용이 없어야하며 이는 연관된 유일한 조치 여야합니다. 인수가 유효한지 확인하는 것은 허용되지만 문서에 설명되어 있어야합니다.


1
"세터와 게터가 있는지 여부"+1 그리고 "방법 이름에 대한 또 다른 +1은 그것이 무엇을하는지 설명해야합니다".
aviv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.