게터와 세터 결합


16

jQuery와 같은 JavaScript 라이브러리는 프로그래밍 인터페이스에서 'getter'와 'setter'를 결합합니다.

 $('element').css({'color','blue'});

색상을 설정하거나

 $('element').css();

요소의 CSS를 얻습니다.

이러한 패턴의 이름이 있습니까? 응용 프로그램에서 사용하는 것이 좋습니다?

답변:


12

Martin Fowler는 최근 이 기사 에서 오버로드 된 getter 및 setter라는 이름을 지정했습니다 .

나는 최근에 자바 스크립트를 파고 들었고, 놀란 것은 게터와 세터에 동일한 함수 이름을 사용하는 습관입니다. 따라서 jQuery에서 배너의 높이를 찾으려면 사용 $("#banner").height()하고 높이를 변경하려면 사용하십시오 $("#banner").height(100).

이 컨벤션은 스몰 토크에서 사용 된 것으로 친숙합니다. 값을 가져 와서 banner height변경할 수 있습니다 banner height: 100. 그것이 작은 대화법이라는 것을 아는 것만으로도 나는 그 언어에 대한 먼 그러나 끊임없는 사랑을 가지고 있기 때문에 그것을 좋아할 것으로 기대하기에 충분합니다. 그러나 가장 좋은 것조차도 결함이 있으며이 코딩 스타일에 대한 싫어하는 것을 숨길 수 없습니다 ...

이 환경 설정에도 불구하고 다루는 언어의 규칙을 따라야합니다. 스몰 토크를 다시 쓰고 있다면 height:100언어의 규칙과 일관성을 유지하기 위해 계속 사용 합니다. 그러나 Javascript는 강력한 규칙으로 유명하지 않으므로 jQuery에서 사용 하더라도이 규칙을 피하는 것이 좋습니다.


1
나는 일반적으로 파울러의 말 대부분에 동의하지만, 이것에 대한 그의 싫어하는 의견에 동의하지 않습니다. 그의 추론은 JavaScript에는 스몰 토크와 같은 강력한 규칙이 없기 때문에 사용할 수 있다는 것입니다. 그러나 jQuery에는 강력한 규칙이 있으며 JavaScript는 jQuery가 아닙니다. jQuery는 프레임 워크입니다.
CaffGeek September

@ 차드, 나는 당신의 독서에 동의하지 않습니다. 그의 주장은 명확성과 일관성이 부족하다는 것입니다. 그는 다른 주제와의 일관성이 그의 우려보다 우선하기 때문에 스몰 토크에서 사용한다고 말합니다. 그는 스몰 토크의 관습이 어떻게 든 문제를 완화 시키거나 제거한다고 주장하지는 않는다.
Winston Ewert

2

OO 언어에서는 "메소드 오버로드"또는 비 OO 언어에서는 "기능 오버로드"라고합니다.

좋은 습관인지 아닌지는 게터 / 세터 대 공개 회원만큼이나 많은 논쟁의 주제입니다. 찬반 양론 자들은 아마도이 기능이 있거나 그렇지 않은 방식으로 설정되어있는 언어로 이빨을 잘라낼 수 있습니다. 나는 그것을 사용하고 여러 가지 이유로 연습을 좋아합니다.

  • 그것이 사용되는 맥락은 서로 잘 분리되어 있습니다.
  • 앞에 get또는 set메소드 이름을 추가하면 자세한 정보가 추가됩니다.
  • 여러 게터가있는 경우 (예를 들어, 하나 int하나에 대한 double) 할당 (의 LHS의 유형 변경, int x = foo.bar()대를 double x = foo.bar()코드 변경 (필요하지 않음) barAsInteger()barAsDouble()클래스 모두를 제공하는 경우 오른쪽으로)를. 이것의 단점은 때로는 코드를보고 호출하는 메소드를 정확히 알기가 어려울 수 있다는 것입니다.

C ++에서는 "함수 오버로딩"이라고도합니다.
DeadMG

두 용어 모두 메소드와 노출 된 함수를 모두 가지고 있으므로 C ++에 적용됩니다.
Blrfl

1

JavaScript에는 실제 속성이 없으므로 (값을 설정하면 실제로 코드를 실행할 수 있음) 패턴은 속성 관용구를 구현하는 속성입니다. (다른 것으로 부르더라도)

따라서 실제 속성을 구현하는 언어에서는 대신 다음을 수행하십시오.

element.css = ...
x = element.css

속성을 처리하는 언어로 JavaScript 패턴을 사용하는 경우 비정상적인 일이 발생했을 수 있습니다. 그것은 좋은 생각이 아닐 것입니다. 언어가 언어를 처리하는 방식으로 속성을 처리하므로 다른 사람들과 혼동하지 마십시오.


"값을 설정하면 실제로 코드를 실행할 수 있습니다". 더 이상 사실이 아닙니다. ECMA 5
Demian Brecht (

@Demian : 그러나 JQuery는 ECMA 5를 구현하지 않는 브라우저에서 작동합니다.
John Fisher

크로스 브라우저 호환성에 대해서는 언급하지 않았으며 인용 된 내용이 옳지 않다는 것입니다.
데미안 브레히트

@Demian : 가장 일반적으로 사용 가능한 JavaScript 버전을 사용한다고 가정하면 "JavaScript에 실제 속성이 없습니다"라는 텍스트가 올바른 것입니다. 우리는 JQuery 구현의 맥락에서 논의하고 있기 때문에, 그 진술은 정확할 것입니다. 그래도 최신 버전의 JavaScript에는 진정한 속성이 있습니다.
John Fisher

0

당신이 찾고 있다고 생각합니다 properties


이것이 C #에서 제공되는 기능 (및 다른 .NET 언어?)과 유사한 이름이지만 실제로는 다릅니다.
Thomas Owens

Wikipedia도 동의합니다 : en.wikipedia.org/wiki/Property_(programming)
thekip

고마워, 실제로 당신은 당신이 응용 프로그램 person.salary('10000')등에서 사람의 급여를 설정하거나 얻는 경우를 말할 수는 없습니다 person.salary().
yannis

1
어떻게 보지 못합니다. "속성은 필드와 같이 읽고 씁니다"(원래 게시물의 예에서는 해당되지 않음). 거기에서 명시적인 메소드 호출이 이루어집니다. 매우 유사하지만 정확히 동일하지는 않습니다.
Thomas Owens

1
@yannis 이것은 정확하지 않습니다. JavaScript에는 속성에 대한 구문이 있으며 원래 질문에서 설명한 것이 아닙니다. JavaScript에서 속성을 구현하고 사용하는 방법 은 en.wikipedia.org/wiki/Property_(programming)#JavaScript 를 참조하십시오 .
Thomas Owens

0

클래스, 메소드 또는 함수가 한 일을해야 - 내 의견으로는, 그리고 결합 : 나는 간단한 이유 좀 완전히 그에 대한 해요 gettersetter방법은 해당 규칙을 위반하는 것입니다. 결과로서:

  1. return함수의 값은 경우에 따라 달라 게터 또는 세터 블록이 실행하자. 이것은 단순히 유지 보수의 악몽으로 이어질 수 있습니다. 귀하의 방법은 어떤 경우에도 데이터 / 객체의 하나의 유형을 반환해야합니다 - 또는 반환 null, false또는 던져 exception오류의 경우.
  2. 이 기능은 완전히 다른 두 가지 기능을 담당하므로 단위 테스트 작성 이 더 어려워집니다.
  3. 그러한 방법이나 기능에 대한 문서를 작성하는 것은 명백한 이유로 어렵습니다.
  4. 답변 에서 이미 언급했듯이 여러 getter 메소드가 필요할 때 일관성이 없습니다 Blrfl.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.