스위프트 함수 대 계산 된 속성


26

Event다음과 같이 수업이 있다고 가정 해보십시오 .

class Event {
    private var attendees: [Person] = []

    // Case 1
    //*******
    // Should I use a func…
    func countOfAttendees() -> Int {
        return attendees.count
    }

    // …or a var
    var countOfAttendees: Int {
        return attendees.count
    }

    // Case 2
    //*******
    // Should I use a func…
    func countOfPaidAttendees() -> Int {
        return attendees.filter({$0.hasPaid}).count
    }

    // …or a var
    var countOfPaidAttendees: Int {
        return attendees.filter({$0.hasPaid}).count
    }
}

위에 표시된 두 가지 경우에 함수 또는 계산 된 속성 을 사용하는 것이 가장 좋은 방법 입니까?


2
stackoverflow.com/questions/24035276/… ... 간단히 말하면 : '함수는 함수이고 속성은 속성이되게하십시오.'
Robert Harvey

답변:


14

을 따르지 통일 액세스 원리 ,

모듈이 제공하는 모든 서비스는 균일 한 표기법을 통해 사용 가능해야하며, 스토리지 또는 계산을 통해 구현되는지 여부를 배신하지 않습니다.

나에게 이것은 인수를 취하지 않고 값을 반환하는 펑크를 쓰지 않는다는 것을 의미합니다. 나는 항상 계산 된 속성을 사용합니다. 이렇게하면 나중에 계산 된 속성을 저장된 속성으로 변경하기로 결정한 경우 내 앱의 모든 위치에서 parens를 제거하려는 충동이나 저장된 값을 반환하는 별도의 "getter"메서드 없이도 그렇게 할 수 있습니다. 매우 낭비적인 IMHO처럼 보입니다.

저장된 속성을 계산 된 속성으로 변경하면 끝 부분과 응용 프로그램에서 사용되는 모든 위치에 Parens를 추가 할 필요가 없습니다.


나는 원래 @Anton의 복잡성 답변과 함께 갔지만 실제로 이것이 내가하는 방법이라는 것을 깨달았습니다 ... 기본적으로 속성.
Ashley Mills

17

계산의 복잡성과 사용 빈도에 따라 다릅니다.

  • 그것의 경우 O(1)/ *다음 계산 된 속성을 사용합니다.
  • 그것의 경우 O(N)+/ rare-use다음 함수를 사용합니다.
  • 그것이 O(N)+/ frequent-use라면, 미래에 복잡성을 보상하기 위해 캐싱 또는 다른 "스마트"기술을 사용할지 여부를 결정하고, "예"이면 속성을 사용하고, "아니오 아니오, 너무 무겁다면"함수를 사용하십시오 .

2
같은 추론을 사용하여 어떻게 시작했는지 재미 있습니다. 만약 당신이 객체를 바꾸지 않는 한 가벼운 프로세싱을해야하더라도 속성이라는 인상을 줄 수 있다면 그것을 속성으로 만드십시오.
Dielson Sales

9

나는 최근 Kotlin을 배우기 시작했으며 계산 된 속성을 사용할 때에 대해 훌륭한 추론을했습니다.

기능 대 속성

경우에 따라 인수가없는 함수는 읽기 전용 속성과 호환 될 수 있습니다. 시맨틱은 유사하지만 서로 선호하는시기에 대한 스타일 규칙이 있습니다.

기본 알고리즘이 다음과 같은 경우 함수보다 속성을 선호합니다.

  • 던지지 않는다
  • O (1) 복잡도
  • 계산 비용이 저렴합니다 (또는 첫 번째 실행시 계산 됨).
  • 호출에 대해 동일한 결과를 반환합니다

-https : //kotlinlang.org/docs/reference/coding-conventions.html


속성을 던질 수 없기 때문에 '포기하지 않는다'는 또한 스위프트 중요하다 (아직?)
alejandromp

"O (1) 복잡성"문서에서 제거되었습니다
Mahmoud Shahoud

7

Swift에서 매개 변수가없는 함수와 계산 된 속성은 거의 동일한 기능을 갖습니다 (매개 변수가없는 함수도 클로저 인 반면 계산 된 속성은 그렇지 않은 차이가있을 수 있음).

차이점은 의미 상입니다. 코드가 작업을 수행하고 해당 작업의 결과에 대한 설명 등을 반환하면 함수를 사용합니다. 코드가 속성을 계산하지만 사용자 관점에서 이것이 저장된 속성이거나 캐시 된 값을 먼저 업데이트 해야하는 저장된 속성 일 수 있다면 계산 된 속성을 사용합니다.

큰 차이점 : 함수 또는 계산 된 속성을 두 번 호출하면 어떻게됩니까? 계산 된 속성의 경우 x = 속성이라고 생각합니다. y = 속성은 x = 속성과 동작이 동일합니다. y = x를 제외하면 조금 느리게 실행될 수 있습니다. 함수의 경우 동작이 다른 경우 놀라지 않을 것입니다.


4

countOfAttendees및을 사용하십시오 countOfPaidAttendees().


계산 된 변수는 액세스 할 때마다 계산 된 값을 반환하는 변수입니다. 즉, 값을 저장하지 않습니다. 내부적으로 함수로 구현됩니다.

함수와의 차이점은 무엇입니까?

  • 의미 상 변수는 상태이고 함수는 동작입니다.
  • 기능은 개인 스토리지에 대한 액세스를 규제합니다. 계산 된 변수는 더 간결한 방식으로 동일하게 수행 될 수 있습니다. .
  • 계산 된 변수는 KVO와 함께 사용할 수 있으며 #keypath로 전달되며 willSet, didSet 관찰 기능이 있습니다.

다음과 같은 경우 변수를 사용해야합니다

  • 던지지 않는다
  • 간단한 속성을 반환합니다
  • 이름에 부작용이나 동사가 없습니다.
  • O (1)입니다. 즉, 상당한 비용이 발생하지 않습니다. 귀하의 예에서는 O (n)입니다.
  • 그것은 dem 등이다. 여러 번의 동일한 호출은 동일한 값을 반환하거나 객체를 동일한 상태로 설정합니다.

함수보다 변수를 선호하는 관련이없는 이유

  • 계산 된 변수는 ()를 입력하지 않아도됩니다. 그러나 명확성은 간결성보다 중요하므로 이는 약한 주장입니다.
  • 읽기 전용 변수는 읽기 / 쓰기로 대체 될 수 있습니다. 함수는 항상 읽기 전용임을 나타냅니다. 그러나 Apple은 array.count와 같은 읽기 전용 변수에 속성을 사용합니다. 의심스러운 경우 플랫폼과 일관성을 찾으십시오.

자원

WWDC 2014 부터  -204 Cocoa의 새로운 기능  > 24:40 @property 사용시기

객체의 값이나 상태 또는 다른 객체와의 관계에 관한 정보에는 속성을 사용하십시오. 나쁜 후보자 :

  • 로드, 파싱, 토글,…. 그들은 그 이름에 동사가 있습니다.
  • 생성기 : 초기화, 복사, 열거,… 이러한 방법은 dem 등성이 아닙니다.
  • 상태를 변경하는 메소드 : nextObject.

Erica Sadun의 스위프트 스타일 에서   > 계산 된 속성과 방법

속성은 인스턴스의 고유 품질을 나타내는 반면 메서드는 작업을 수행합니다.

  • 메소드에는 매개 변수가 있습니다. 속성이 없습니다. 부작용이있는 통화에는 선호되는 방법입니다. 메소드가 무언가를 수행하거나 (예를 들어,로드, 구문 분석, 토글 또는 인쇄) 동사 이름을 가진 경우, 특성이 아니어야합니다.
  • 가져 오거나 설정할 수있는 간단한 값에 대한 속성을 선호하십시오.
  • 속성은 형식 인스턴스의 의미 적 고유 품질을 표현해야합니다.
  • 속성을 사용하면 willSet 및 didSet을 통해 관찰자를 추가 할 수 있습니다. 저장된 인스턴스 속성과 달리, 저장된 유형 속성에는 항상 기본값이 제공되어야합니다.

에서  코 틀린 속성 대 규칙> 기능을 코딩 . 위의 Daniel의 답변을 참조하십시오 .

관련 정보가없는 기타 자료 :


3

나는 func . 객체 지향 프로그래밍은 계산 된 속성없이 잘 작동합니다. 계산 / 필터링 된 값을 되 찾아서 계산 된 속성이 올바르게 느껴질 수도 있습니다. 그러나 여기 내 불만이 있습니다. 그렇게하면 가독성이 가치처럼 느껴지기 때문에 가독성이 높아집니다.

이 맥락에서 계산 된 값을 할당하려고 시도하는 것이 합리적이지 않으며 운 좋게 IDE 가이를 피하는 데 도움이됩니다.하지만 계산되었지만 값처럼 보이는 것을 할당하려고하면 어떻게됩니까?

event.countOfAttendees = 0; // not possible

func를 사용하는 동안 호출자는 값을 직접 다루지 않는다는 것을 알고 있습니다.

event.countOfAttendees()

행동 객체라면 데이터 구조처럼 보이지 않고 동작하는 것처럼 보입니다. 객체가 멍청하고 아무런 행동이 없다면 왜 캡슐화하려고합니까? 이 경우 참석자 만 공개 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.