단어가 명사 및 동사 일 때 변수 이름을 지정하는 방법


48

다음과 같은 일반적인 지침으로 코너 케이스 문제가 발생했습니다.

  • 변수의 명사
  • 함수 동사

특히, 단어가 모호한 경우가 있습니다-동사 또는 명사 일 수 있습니다 . 그리고 어떤 경우에는 응용 프로그램을 논의 할 때 동일한 문장에서 가지 방식 으로 사용됩니다 .

나는 몇 달 후 코드 섹션으로 돌아갈 때 나 자신뿐만 아니라 미래 개발자도 프로그램을 계속 읽을 수 있도록 노력하고있다.

예제 중 하나는입니다 battery. A는 batteryA가 들어 charge당신도 할 수있는 charge()배터리.

나는 모두를 가지고 있다고 생각 Battery.Charge하고하는 것은 Battery.Charge(value)미래의 개발자들에게 혼동을 줄 수 있습니다.

현재 해결 방법은 해당 사례 중 하나 또는 둘 다에 대해 다른 단어를 선택하는 것입니다 (변수 및 함수). 그 접근법에 대한 나의 문제는 Battery객체의 변수와 함수 charge가와 관련된 디자인 토론과 일치하지 않는다는 것 Battery입니다.

내 질문은 명명 규칙 에서이 충돌을 처리하는 또 다른 더 좋은 방법이 있는지 여부입니다.


주제에 대한 추가 자료. 아무도 내 질문의 특정 문제를 해결하지 못했습니다.


3
충전 기능 addCharge를 쉽고 명확하게 만듭니다
래칫 괴물

2
명사 변수 앞에 "Current-"를 붙일 수 있습니까? "CurrentCharge"대 "Charge ()"?
Brian Snow

6
또는 그냥 충전 레벨 현재 충전을 얻기 위해
ratchet freak

5
단어를 구성하십시오. WordNet은 enqueue단어가 아니라 Java의 동사 라고 생각 합니다. 어때요 doCharge? 다른 방법은이 접두사를 갖지 않기 때문에 여전히 대칭 테스트에 실패합니다.
Miserable Variable

5
"현재"= 현재 또는 "전류"= 충전 흐름. 진정한 해결책은 영어를보다 합리적인 언어로 바꾸는 것입니다!
DarenW

답변:


38

비슷한 상황에서 나는 동의어를 찾으려고 노력합니다. 이 경우 동사에 "충전"을 사용합니다. "재"는 약간 중복되지만 그 의미는 분명합니다. 배터리의 남은 충전량에 간단한 "충전"을 사용하는 것은 물리적 인 단위를 지정하지 않기 때문에 모호합니다. "availableAmpHours", "hoursUntilRecharge"또는 이와 유사한 것을 선호합니다. 단위는 어플리케이션에 편리한 것에 달려 있습니다.

개인적으로 선호하는 것은 상태를 바꾸는 함수에 대해서만 동사를 사용하는 것입니다. 비 돌연변이 함수에는 명사를 사용합니다. 나는 그것이 당신의 관점에 달려 있다고 생각합니다. 기계 수준에서는 비 돌연변이 기능이 작동하지만 모델 수준에서는 그렇지 않습니다.


2
단위에 대한 훌륭한 지적. 이 경우 단위는 실행중인 분석에 따라 변경 될 수 있으므로 명시 적으로 제외됩니다. 즉, 우리는 다른 시간 척도를 사용하고 있으며 배터리는 분석 척도 측면에서 작동을 조정합니다.

1
값 비싸고 비 돌연변이 기능을위한 동사를 선호합니다. 예를 들어 데이터베이스에서 쿼리를 실행하는 함수입니다.
Brian

20

이 문제를 해결하는 것만으로도 모호한 이름 지정 인스턴스에 대한 해결책은 배터리에서 해당 기능을 완전히 제거하는 것입니다. 나는 자체 충전 배터리를 본 적이 없으며 BatteryCharger 클래스를 갖는 것이 더 합리적입니다. 이렇게하면 문제가 더 분리되고 조치가보다 명확 해집니다.

battery.Charge(50) vs batteryCharger.Charge(battery, 50)

나에게 두 번째 형태는 훨씬 더 이해하기 쉽고 모든 배터리 클래스에 뿌려주는 대신 모든 "충전"코드를 한 곳에 보관합니다.


6
나쁜 생각은 아니지만이 경우 Battery배터리 + 충전 시스템의 추상화입니다. 우리의 응용 프로그램은 두 가지 측면을 별도의 객체로 나눌 필요가 없으므로 Battery편의를 위해 하나 (일명 ) 로 롤백됩니다 . 궁극적으로 충전식 배터리의 물리학은 충전을 수용 할 수있는 기능이 있음을 나타냅니다.

이 경우, 나는 kevin cline의 대답이 당신이 찾고있는 것이라고 제출합니다. 명확성을 위해, 변경 기능에는 재충전 및 방전을 사용하고 속성 이름에는 충전을 사용합니다. ChargePercent도 좋은 방법 일 것입니다.
mortalapeman

당신은 아마도 자바 프로그래머입니까? 이것은 반복하지 말아라. 실제로, "50"매개 변수를 제외하고 모든 것을 반복하고 있습니다. 내가 시도하면 DRY 위반의 더 나쁜 예를 생각해 낼 수 없었습니다.
박스

@boxed 내 모범을 보이고 있습니까? 구현이 없을 때 DRY를 위반한다고 주장하는 방법을 잘 모르겠 기 때문에. 저는 SOLID 원칙을 강력하게지지하며 어떻게 그 결론에 도달했는지 보지 못합니다.
mortalapeman

당신은 어떻게 든 배터리의 상태 변화를 야기 할 불필요한 BatteryCharger 클래스를 생성함으로써 DRY를 위반하고 있습니다. 따라서 BatteryCharger는 입력을 받아 들여 즉시 Battery로 전달합니다.
케빈 클라인

9

이중 의미를 피하십시오

의도적으로 하나 이상의 의미가있는 단어를 선택했으며 첫 번째 결정은 문제입니다. 프로그래머에게는 문제가되는 수많은 단어가 있습니다. 또 다른 예는입니다 phone. 당신은 할 수있는 phone사람을, 또는 당신은있을 수 phone주머니에.

게터와 세터 사용

대부분의 객체에 대한 표준 명명은 속성에 대한 getter / settings 메소드입니다.

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

속성은 명사가 아닌 국가입니다

객체 속성을 명사로 분류하여 실수했다고 생각하고 변수도 상태를 생각할 수 있습니다. 그것들은 그들의 존재 범위와 관련된 상태입니다.

그들이 명사로 보유하고있는 가치를 설명 할 수는 있지만, 그것이 모든 경우에 해당되는지는 확실하지 않습니다.

OOP 용어에서 객체 속성은 해당 객체의 상태를 설명합니다. 귀하의 경우에는 Battery객체이며 Charge상태입니다. 그래서 그것은 객체의 속성이 될 것입니다, 그러나 이것은 그것이 어떻게 사용되는지에 달려 있습니다.

Charge배터리 를 사용할 수 있어야하고 전류 Charge가 무엇인지 알면 문제가있는 것입니다.

범위를 사용하여 컨텍스트 적용

문맥은 당신이 전달하고자하는 단어 나 방법의 의미를 명확히 할 것입니다. 범위는 객체 외부에서 속성 / 방법의 접근성을 설정합니다.

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

방법은 동사입니다

객체의 방법을 동사로 설명 할 수 있지만 동작이라는 단어가 더 적합합니다. OOP 용어에서는 객체의 방법을 사용하여 객체에 대한 작업을 수행합니다. 객체 외부에서 객체의 속성을 수정하는 것은 좋지 않습니다. 상태를 변경시키는 데 필요한 조치를 수행하는 메소드를 호출하는 것이 좋습니다.

이 단어 Charge는 동사이지만 명사이기도합니다. 동작의 메소드를 호출하는데 사용될 때 동사가 사용되고 있다는 것이 분명해진다 Battery.Charge(....).

그러나 상황은 매우 중요합니다. 단어 Charge()는 동사이지만 의미가 없습니다 startCharging().

유효한 방법을 Battery포함 할 수있다 Charging, Discharging, setCharge, getCharge, hasCharge, DischargeCharged.

간단한 한 단어 방법은 종종 명시 적으로 명확하게 자신의 행동을 언급하지 않지만, 같은 몇 가지 경우가 있습니다 openclose약간의 설명이 필요한 곳은.

따라서 이러한 유형의 속성 / 방법의 이름을 지정하는 방법에 대한 정답은 없습니다. 혼동이 없도록 위의 기술을 현명하게 사용해야합니다.


2
기록상 고객은 모호한 용어를 사용하는 사람입니다. 나는 그 혼란을 만들지 않았다. :-) 나는 그런 상황에 처한 유일한 사람이 아닐 수도 있다고 생각했기 때문에 질문을 제기했습니다. 당신은 당신의 대답에 몇 가지 유효한 포인트가 있습니다. 이 특정한 경우에, 우리는 시간의 단위에서 작동하지 않는 StartCharge()EndCharge()의미한다. 실제로이 용어는 배터리 시스템 처리에 상당한 오버 헤드를 추가합니다. 각 간격마다 Charge()또는 Discharge().

1
가장 큰 어려움은 내부 프로그래밍 의미를 클라이언트가 사용하는 용어와 동 기적으로 유지하는 것입니다. Charge이 영역에서 가장 쉽게 이해되는 모호한 단어가됩니다. 다른 몇 가지가 있습니다.

6

동사를 동사 나 명사로 만들 동사 앞에 붙입니다.

Battery.doCharge()

Battery.getCharge()

4

동사의 경우에는 Charge괜찮습니다. 명사 사건의 경우 getCurrentChargeLevel효과가 있습니까?


확실하지 않습니다. C #을 사용하기 때문에 별도의 함수가 아닌 속성에서 get 및 set을 선언 할 수 있습니다. 그것과 관계없이, 나는 유지 보수와 내가 쓴 것을 잊었을 때 그것이 어떻게 보일지에 대해 걱정하고 있습니다. getCurrentChargeLevel()여전히의 내부 변수를 참조 할 필요가 없으며 Battery해당 변수의 이름은 무엇입니까?

충전은 전압 또는 백분율입니까?
mhoran_psprep

1
@ GlenH7 : 아, 알겠습니다. C #을 지정하지 않았고 뇌가 Java 모드에 있습니다. 어느 쪽이든, 나는 현재 배터리에서 충전되는 양을 나타내는 명사에 대해 라인을 따라 뭔가 Battery.currentChargeLevel작동 할 수 있다고 생각합니다. 당신은 사용 Battery.coloumbs하거나 시도 할 수 Battery.ampereHours있지만 분명하지 않을 수 있습니다 ...
FrustratedWithFormsDesigner

1
@mhoran_psprep-둘 다. ;-) ChargeEnergyPower(A == * 볼트 와트) 시간을 곱한. 따라서이 경우 요금은 숫자입니다. 충전 상태도 백분율로 나타납니다.

@FrustratedWithFormsDesigner-예, 언어에 관계없이 더 넓은 코너 케이스가 적용 가능하다고 생각했기 때문에 C #을 제외했습니다. Watt*time확실히 디자인 대화와 일치하지는 않지만 ChargeLevel그렇게 할 것입니다.

0

대부분의 경우 도움 동사, 부사 또는 형용사를 추가하는 것은 그것들을 구별하기에 충분하며 실제로 이해하는 데 도움이 될 수 있습니다. 배터리에 충전 및 충전 ()을 사용하면 DeltaCharge ()는 충전 또는 방전을 처리 할 수있는 기능임을 나타낼 수 있습니다.

델타 (변경이 있지만 모호한 경우)는 상태 변경을 처리하기 위해 항상 (다른 동사가 반 명백한 경우에도) 사용하고 다른 사람들에게 권장하는 수정 자입니다.


0

구조에 헝가리어 표기법. 당신은 할 수 있습니다 intChargefcnCharge(value)따라서 혼란을 피하고 세 글자가 잘 작동 할 때 미친 긴 이름을 추가하지.

또는 동일한 이름을 사용하여 IDE에서 처리하도록 할 수 있습니다. 더 길거나 다른 이름을 만드는 것은 결국 장기적으로 혼란 스러울 수 있습니다.


답에 대한 독특한 관점을 위해 +1. 안타깝게도 헝가리어 표기법은 코드 스타일 가이드 라인에 따라 명시 적으로 잘못 표시됩니다. 그것은 당신의 대답의 잠재적 장점을 변화시키지 않으며, 단지 그것을 실제 솔루션으로 사용할 수 없다는 것입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.