내부 변수가 공개되고 액세스 가능하다고 선언 될 때 사용되는 용어가 있습니까?


10

누군가 getter / setter 메소드를 사용하지 않고 내부 변수 $ _fields에 액세스 할 수 있도록 코드를 작성하는 경우이를 설명하는 데 적절한 용어가 있습니까?

관리와 함께 사용할 정도로 공손한 것 :)


9
캡슐화 부족?
Oded

@Oded 난 당신이 옳은 것 같아요-캡슐화 부족 /
잘못

이 질문에 대답하려고 할 때 생각했던 두 구절은 "유연한 추상화"와 "느슨한 범위 지정"이었습니다. 각 사람들은 무엇을 말하는가?
PeterB

1
유출되는 추상화는 개념을 추상화하려고 할 때 작동하지만 실제로 작동하지 않습니다. 기본 개념은 여전히 ​​유출됩니다 (HTTP / HTML을 통한 SQL 및 웹 프레임 워크의 ORM은 유출되는 경향이 있습니다).
Oded

@PeterB-Oded의 설명에 추가하려면 다음을 참조하십시오 : joelonsoftware.com/articles/LeakyAbstractions.html
Joris Timmermans

답변:


30

예의 바른 사회에서 개인을 노출시키는 것은 결코 좋은 일이 아닙니다 ...

이 관행은 캡슐화 부족 / 불량입니다.


6
+1 글쎄, 당신은 당신 의 사무실에서 당신의 개인을 꺼내지 않을까요?
StuperUser

6
-1 : 캡슐화가 실제로 발생하고 잘 수행되었습니다. 그러나 일반적으로 받아 들여지는 방식으로 소스 코드를 통해 문서화 되지 않았습니다 . 파이썬과 같은 일부 언어에는 실제로 개인 변수가 없지만 여전히 캡슐화를 연습합니다.
S.Lott

6
@Oded : 캡슐화는 디자인 컨셉 입니다. 언어마다 개념이 다르게 구현됩니다. 개인 선언이있는 언어는 한 가지 구현을 허용합니다. 상태 비 저장 개체가 포함 된 기능적 프로그래밍 언어는 구현 방식이 다를 수 있습니다. 파이썬 ( private)에는 캡슐화 개념의 또 다른 구현이 있습니다.
S.Lott December

1
@S 로트; Oded-캡슐화가 양호하고 다른 클래스에서 개인 변수에 자주 액세스하는 코드에 대한 캡슐화가 좋지 않습니다. 파이썬에서는 다른 클래스의 이름 얽힌 개인 변수에 액세스하거나 단일 밑줄 접두어의 규칙을 무시 하여이 작업을 수행합니다 (게터가 다른 동작을 수행하는 경우에도 실제로 __이름 맹 글링에 사용해야 함 ). 다른 언어도 캡슐화가 잘못 될 수 있습니다 (예 : Java에서의 리플렉션 및 C ++의 포인터 산술)는 개인 변수를 얻습니다. 파이썬은 구문을 성가 시게하지 않습니다.
dr jimbob

2
@ drjimbob : 파이썬 코드는 __이름 맹 글링을 거의 사용하지 않습니다 . 이 없으면 __디자인은 여전히 ​​우수한 캡슐화를 반영합니다. "공개"는 "캡슐 부족 / 부족"을 의미한다고 잘못 주장했습니다. 개념은 여전히 ​​존재합니다. 소스 코드에는 적절한 장식이 없습니다.
S.Lott

10

프로그래밍 언어와 패러다임에 따라 Oded가 이미 언급 한 캡슐화가 부족한 것 외에도 "일반 데이터" (반드시 패턴이나 코드 냄새 일 필요는 없음) 일 수도 있습니다.



2

그것은 속성 가방이라고합니다.

일반적으로 관련 속성 집합을 보유하는 데 사용됩니다 (각각 적절한 액세스 지정자가 있거나없는 클래스 개체 일 수 있음). 그러나 주변 구조는 단지 속성의 가방입니다.


2

"특정 코딩 표준을 따르지 않음"이라고합니다.

OP는 다음과 같이 썼다.

getter / setter 메소드를 사용하지 않고 내부 변수 $ _fields에 액세스 할 수 있습니다.

그것은 표준에 위배 될 수 있으며, 따라서 코드 냄새 일 수 있습니다. 그러나 반드시 그런 것은 아닙니다 캡슐화 나쁜 . 게터와 세터에 대한 내부 변수 ( "내부 전용")를 외부 세계에 노출시키는 것은 훨씬 더 나쁠 것입니다.

문제는 : $_fields외부 세계에 접근 할 수 있어야 하는가?

그렇다면 getter / setter 메소드를 추가하는 경우가 있습니다. 이 메소드는 $_fields어떤 종류의 변수 인 것을 제외하고는 아무것도 캡슐화하지 않습니다 (즉석에서 계산 / 가져 오기 / 등이 아닌). 언어에 따라 유형 (일부 구현 세부 사항)을 외부로 유출 할 수 있습니다. 항상 getter / setter를 원하는지 또는 "필요"가 코딩 표준 문제인 경우에만.

경우는 $_fields해야 하지 액세스 할 수 있습니다, 다음, 음, 액세스하지 않습니다. 다른 사람이 언어 수준 (비공개 및 친구)에서 액세스하지 못하게해야하는지 여부 (특정 상황에서 디버깅이 쉬울 수 있음)는 다시 코딩 표준 문제입니다.

캡슐화 문제는 이것과 완전히 직교합니다. 게터 및 세터를 사용하면 캡슐화를 위반할 수 있습니다. 심지어있어 쉽게 코드를 보이는 모범 사례를 다음과 같은 것 - 그들은 getter 및 setter의 무리를 볼 때 대부분의 사람들의 경종이 울리지 않기 때문에,에 슬립. $_fields로 지정된 변수보다 내부 구현 세부 사항에 훨씬 더 많은 종속성을 도입 할 수있는 코드 private입니다.

나는 나쁜 유추의 팬입니다. 열악한 캡슐화를 부르는 것은 총을 든 사람을 살인자로 부르는 것과 같습니다.



-2

setter / getter 메소드가 그 이상일 경우

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

그런 다음 음모 변수를 만드는 것은 차이점이 중요한 몇 가지 경우를 제외하고 타이핑을 저장하는 것입니다.


3
그것이 모든 게터와 세터가 이제는 항상 그렇게되는 것을 의미하지는 않습니다. 그리고 setter에 유효성 검사를 추가하려면 수만 줄의 코드를 결합하여 해당 속성에 액세스하는 모든 곳을 찾으려면 의도적으로 처음 캡슐화를 피함으로써 수십 초를 절약 할 수 있습니다.
Plutor

@Plutor : 그것이 모든 객체가 할 모든 일이라면 (예를 들어, 다른 프로세스로 전송 된 메시지 나 데이터베이스의 레코드를 나타 내기 때문에) 괜찮습니다. 그것들은 고도로 보존 되어야 할 것들입니다 .
Donal Fellows
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.