2010-05-26 3 views
15

나는 분명히 이러한 개념에 새로운 브랜드입니다. 왜 속성이나 메서드에 대한 액세스를 제한하는지 이해할 수 없습니다. 의도 한 결과에 따라 코드를 작성하는 것 같습니다. 단순히 그 메소드를 호출하지 않고 private 메소드를 작성하는 이유는 무엇입니까? 반복적 인 객체 생성 (정확하게 말하면), 다중 개발자 상황 (다른 사람들의 작업을 망치지 말 것)입니까, 아니면 실수로 자신의 작업을 엉망으로 만들지 않아요?OOP/PHP를 처음 사용했습니다. 수업의 가시성과 확장 성의 실용성은 무엇입니까?

+0

바. 비슷한 대답이 많이 있습니다! –

답변

7

모두 캡슐화됩니다. 이것은 수업의 내부를 숨기고 수업 내용을 돌보는 것을 의미합니다. 신용 카드 처리 클래스를 갖고 싶다면 실제로 신용 카드를 처리하는 방법을 '신경 쓰지 않아도됩니다. 그냥 $creditCardProcessor->charge(10.99, $creditCardNumber);과 같이 작동하고 싶을 것입니다.

일부 메소드를 공개하고 다른 메소드를 비공개 또는 보호함으로써 다른 사람들이 코드를 호출하는 것이 안전한 곳을 알 수 있도록 항목을 남겨 둡니다. 공용 메서드와 변수를 '인터페이스'라고합니다.

모든 클래스의 경우 구현입니다. 이것이 학급이 의무를 수행하는 방법입니다. 스무디 만드는 클래스 인 경우, 클래스가 재료를 추가하는 방법, 추가하는 요소 등은 모두 구현의 일부입니다. 외부 코드는 구현을 알지 못하거나 신경 쓰지 않아야합니다.

클래스의 다른 쪽 인터페이스. 인터페이스는 외부 개발자가 클래스 외부에서 호출 할 수 있도록하는 public 메서드입니다. 즉, 공용 메서드를 호출 할 수 있어야하고 제대로 작동합니다.

+0

명확한 정의와 예제를 가져 주셔서 감사합니다. –

8

우리는 클래스의 소비자가 구현 세부 사항을 신경 쓸 필요가 없도록 개인 메서드를 만듭니다. 즉, 우리 클래스가 제공하는 몇 가지 멋진 요소에 집중할 수 있습니다.

또한 공개 메소드의 모든 가능한 사용을 고려해야합니다. 메소드를 비공개로 설정함으로써 클래스가 지원해야하는 기능의 수를 줄이고 더 많은 자유를 변경할 수 있습니다.

Queue 클래스가 있다고 가정 해보십시오. 호출자가 항목을 대기열에 추가 할 때마다 대기열의 용량을 늘려야 할 수 있습니다. 기본 구현 때문에 용량을 설정하는 것은 쉬운 일이 아니므로 Enqueue 기능의 가독성을 높이기 위해 별도의 기능으로 나누십시오. 호출자는 대기열의 용량에 대해 신경 쓰지 않으므로 (호출자가 처리해야 함) 메서드를 비공개로 만들 수 있습니다. 호출자가 불필요한 메서드로 인해 혼란 스러울 필요가 없으며 호출자가 우스운 일을 수행 할까 걱정할 필요가 없습니다 (클래스에 의해 정의 된 제한된 유스 케이스 내에서 여전히 용량을 설정하는 한) 클래스를 사용하는 코드를 깨지 않고도 언제든지 구현을 변경할 수 있습니다.

5

캡슐화를 사용하는 몇 가지 이유가 있습니다. 가장 강력한 것 중 하나는 다음과 같습니다. 다른 사람이 작성한 크고 복잡한 라이브러리를 사용한다고 가정 해보십시오. 모든 객체가 보호되지 않은 경우 개발자가 의도하지 않은 값에 액세스하거나 변경할 수 있습니다.

데이터를 숨기면 프로그램을 더 쉽게 개념화하고 구현하기가 더 쉽습니다.

4

캡슐화에 관한 모든 것입니다. 일을 쉽게하는 우아한 기능을 드러내는 한편, 내부의 꿀꿀 거리는 일을하는 방법은 사적입니다. 예 : 싱글 톤 db 객체의 유효성을 검사하고 쿼리를 안전하게 만드는 등의 4 개의 내부 함수를 사용하는 $ product-> insert() 함수가있을 수 있습니다. 이러한 함수는 노출 될 필요가없는 내부 함수이므로 호출하면 엉망이 될 수 있습니다 다른 구조 나 흐름, 즉 개발자가 제자리에 놓았습니다.

8

마지막 두 점은 상당히 정확합니다. 개발자가 물건을 엉망으로 만들 필요가 없습니다. 오랫동안 프로젝트를 진행한다면, 처음에했던 일을 많이 잊어 버렸다는 것을 알게 될 것입니다.

무언가를 숨기는 가장 중요한 이유 중 하나는 안전하게 으로 변경할 수 있기 때문입니다. 필드가 공개되어 있고 몇 개월 후 필드를 변경하려고 할 때마다 필드가 변경 될 때마다 다른 일이 발생하면 문제가 발생합니다. 공개 되었기 때문에 해당 필드에 얼마나 많은 다른 장소가 직접 액세스했는지를 알거나 기억할 수있는 방법이 없습니다. 비공개 인 경우이 클래스 외부에서 만지면 안된다는 보장이 있습니다. 공용 메서드가 랩핑되어있을 가능성이 높으며 해당 메서드의 동작을 쉽게 변경할 수 있습니다.

일반적으로 공개 할수록 다른 코드와의 호환성에 대해 걱정할 필요가 있습니다.

0

예를 들어 - 개인/보호 된 메서드는 다른 (공용) 메서드에서 호출되는 일부 클래스의 일부일 수 있습니다. 해당 부분이 더 많은 공개 메서드에서 호출되면 의미가 있습니다. 그럼에도 불구하고이 메소드를 다른 곳에서는 호출하지 않으려 고합니다.

클래스 속성과 완전히 같습니다. 예, 모든 공용 클래스를 작성할 수 있지만 그게 재미 있습니까?

2

여러 개발자 상황은 그래서하지 엉망으로 자신의 작업 실수 (안 엉망 다른 사람의 일을), 또는?

주로이 두 가지. 메서드를 public으로 만드는 것은 "클래스가 클라이언트에서 사용되는 방식입니다."라는 메시지를 비공개로 설정합니다. "이것은 경고없이 변경 될 수있는 구현 세부 사항이며 어떤 클라이언트가 신경 쓰지 않아도됩니다." 조언.

몇 가지 잘 정리 된 공개 방법을 사용하는 클래스는 익숙하지 않은 사람 (6 개월 만에 처음 보는 사람)이 더 쉽게 사용할 수 있습니다. 걱정하지 않는 모든 구현 세부 정보를 포함하여 공개됩니다.

1

공동 작업을 쉽게 수행 할 수 있도록 클래스의 사용자에게 어떤 부분을 자주 변경하면 안되는지 알려주고 공용 메서드 만 사용하는 경우 개체가 의미있는 상태가되도록 보장 할 수 있습니다.

개인/공공/무엇이든간에 (언어로 시행되는 것을 의미하는) 매우 엄격 할 필요는 없습니다. 예를 들어, Python에서는 명명 규칙을 사용하여이 작업을 수행합니다. 당신은 공개적이지 않은 것으로 표시된 것을 망쳐서는 안된다는 것을 알고 있습니다.