게터 없이는 좋은 코드를 작성할 수 없습니다.
게터가 캡슐화를 깨뜨리지 않기 때문에 왜 그렇지 않습니까? 게터가 사람들이 OOP를 따르지 않도록 유혹하지 않기 때문에 행동하는 데이터로 메소드를 넣을 수 있습니다. 그들이하다. 아니요, 경계 때문에 게터가 필요합니다.
캡슐화 및 메서드 유지 방법과 메서드가 작동하는 데이터는 메서드 이동을 방해하는 경계에 도달하면 작동하지 않으므로 데이터를 이동해야합니다.
정말 간단합니다. 경계가 없을 때 게터를 사용하면 실제 객체가 없습니다. 모든 것이 절차적인 경향이 있습니다. 어느 것이나 잘 작동합니다.
진정한 OOP는 어디에나 퍼질 수있는 것이 아닙니다. 그것은 그 경계 내에서만 작동합니다.
그 경계는 얇지 않습니다. 그들은 그들 안에 코드를 가지고 있습니다. 이 코드는 OOP 일 수 없습니다. 기능도 할 수 없습니다. 이 코드는 우리의 이상을 제거하여 가혹한 현실을 다룰 수 없습니다.
마이클 페터스 (Michael Fetters)는이 부분을 오렌지색 부분으로 묶은 흰색 결합 조직에 이어이 코드 근막 이라고 불렀 습니다.
이것은 그것에 대해 생각하는 훌륭한 방법입니다. 동일한 코드베이스에 두 종류의 코드가 모두 적합한 이유를 설명합니다. 이러한 관점이 없다면 많은 새로운 프로그래머들이 자신의 이상에 강하게 집착하고, 첫 경계에 부딪 칠 때 그들의 마음을 상하게하고이 이상을 포기하게됩니다.
이상은 적절한 장소에서만 작동합니다. 그들이 모든 곳에서 일하지 않기 때문에 포기하지 마십시오. 그들이 일하는 곳에 사용하십시오. 그 장소는 근막이 보호하는 수분이 많은 부분입니다.
경계의 간단한 예는 모음입니다. 이것은 무언가를 가지고 있으며 그것이 무엇인지 전혀 모릅니다. 컬렉션 디자이너는 보류중인 개체의 동작 기능이 무엇을 보유할지 모를 때 컬렉션으로 어떻게 이동할 수 있습니까? 당신은 할 수 없습니다. 당신은 경계에 반대합니다. 컬렉션에 게터가있는 이유가 여기에 있습니다.
알았다면, 그 행동을 움직일 수 있고 상태를 이동하지 않아도됩니다. 알면 알아야합니다. 당신은 항상 모른다.
어떤 사람들은 이것을 실용적이라고 부릅니다. 그리고 그건. 그러나 왜 우리가 실용적이되어야하는지 아는 것이 좋습니다.
당신은 의미 론적 주장을 듣고 싶지 않다고 말했고 "현명한 게터"를 어디에나 두는 것을 옹호하는 것처럼 보인다. 당신은이 아이디어에 도전을 요구하고 있습니다. 아이디어가 프레임 방식에 문제가 있음을 보여줄 수 있다고 생각합니다. 하지만 거기에 왔기 때문에 어디에서 왔는지 알고 있습니다.
어디서나 getter를 원하면 Python을 살펴보십시오. 비공개 키워드가 없습니다. 그러나 파이썬은 OOP를 잘 수행합니다. 어떻게? 그들은 시맨틱 트릭을 사용합니다. 그들은 밑줄이있는 개인용으로 이름이 지정됩니다. 책임을 진다면 읽을 수 있습니다. "우리는 모두 성인입니다"라고 종종 말합니다.
그렇다면 Java 또는 C #의 모든 것에 게터를 두는 것의 차이점은 무엇입니까? 미안하지만 의미 론적입니다. Pythons 밑줄 표시 규칙은 직원들에게 문 밖에 숨어 있다는 것을 분명히 알려줍니다. 모든 것을 습득하면 그 신호를 잃게됩니다. 리플렉션을 사용하면 어쨌든 개인을 제거하고 의미 신호를 잃지 않을 수 있습니다. 여기서는 구조적으로 논쟁의 여지가 없습니다.
우리가 남긴 것은 "직원 전용"표시를 어디에 둘 것인지 결정하는 일입니다. 사적인 것으로 간주되어야하는 것은 무엇입니까? 당신은 "현명한 게터"라고 부릅니다. 내가 말했듯이, 게터에 대한 최고의 정당화는 우리를 우리의 이상으로부터 멀어지게 만드는 경계입니다. 그것은 모든 것에 게터가되지 않아야한다. 게터가 발생하면 동작을 보호 할 수있는 수분이 많은 비트로 이동시키는 것을 고려해야합니다.
이러한 분리로 인해 몇 가지 용어가 생겼습니다. 데이터 전송 개체 또는 DTO에는 동작이 없습니다. 유일한 메소드는 getter 및 때로는 setter이며 때로는 생성자입니다. 이 이름은 실제 개체가 아니기 때문에 불행합니다. 게터와 세터는 실제로 중단 점을 설정할 수있는 디버깅 코드입니다. 그것이 필요가 없다면 공공 장소 일뿐입니다. C ++에서는 구조체를 호출했습니다. C ++ 클래스와의 유일한 차이점은 기본적으로 public이었습니다.
DTO는 경계 벽 위로 던져서 다른 방법을 안전하게 수분이 많은 행동 오브젝트에 유지할 수 있기 때문에 좋습니다. 진정한 객체. 위반하는 게터가 없으면 캡슐화입니다. 내 행동 객체는 DTO를 Parameter Objects 로 사용하여 먹을 수 있습니다 . 때로는 변경 가능한 공유 상태 를 막기 위해 방어적인 복사본 을 만들어야합니다 . 경계 내 수분이 많은 부분 안에 가변 DTO를 퍼 뜨리지 않습니다. 나는 그들을 캡슐화합니다. 나는 그들을 숨 깁니다. 그리고 마침내 새로운 경계에 부딪 치면 새로운 DTO를 회전시켜 벽에 던지므로 다른 사람의 문제가됩니다.
그러나 당신은 정체성을 표현하는 게터를 제공하고자합니다. 경계를 찾은 것을 축하합니다. 엔터티 에는 참조를 넘어서는 정체성이 있습니다. 즉, 메모리 주소를 넘어선 것입니다. 따라서 어딘가에 보관해야합니다. 그리고 그것은 무언가를 정체성으로 언급 할 수 있어야합니다. 정체성을 나타내는 게터는 완벽하게 합리적입니다. 해당 Getter를 사용하여 엔티티 자체가 결정할 수있는 결정은 아닙니다.
결국 그것은 잘못된 게터의 존재가 아닙니다. 그들은 공공 장소보다 훨씬 낫다. 나쁜 것은 그들이 당신이 아닌 객체 지향되는 척하는 데 사용되는 때입니다. 게터는 좋다. 객체 지향이 좋습니다. 게터는 객체 지향적이지 않습니다. 게터를 사용하여 객체 지향의 안전한 장소를 개척하십시오.