“plus”와“minus”는 적절한 분석법 이름입니까?


21

자바 SE 8 날짜, 도입을위한 새로운 메커니즘을 제공 LocalDate, LocalTime그리고 LocalDateTime시간의 순간을 표현하는 클래스. : 이러한 순간을 조작하기 위해 메소드 세트가 주어 LocalDate.plusDays(...), LocalDate.minusDays(...)등등과.

나는 항상 좋은 실천은 메소드가 실제로 실행될 동작, 동작을 수행 하는 것이므로 목적을 설명하는 동사 뒤에 메소드 이름을 짓는 것이라고 생각했습니다 . 당신이 좋아하는 클래스를 고려한다면 그냥 언급 StringBuilder예를 들어, 메소드의 이름이 append, insert, delete...

이것은 나에게이 방법을 명명 바로 소리를하지 않는 이유는 plusDays대신 sumDays, minusDays대신 subtractDays. 그것은 매우 성가신 것을 찾는 것입니까? 어떻게 생각해?

내가 생각할 수있는 유일한 이유는 날짜가 변경 불가능한 객체이기 때문에 호출 plusDays하면 원래 객체에 요일을 추가하지 않고 새로운 속성을 가진 새 객체를 생성하지만 매우 미묘합니다.


22
나는 당신이 이것을 너무 기술적으로보고 있다고 생각합니다. 메소드 이름의 실제 목표는 그것이 무엇을하는지 명확하게하고 읽을 수있게하는 것입니다. 동사로 이름을 짓는 것은 일반적 으로이 두 가지 목표를 달성 한다는 것이 밝혀졌습니다 . 그러나 sqrt제곱근을 취하는 메소드를 고려하십시오 . 이 메소드의 이름을 지정 takeSqrt하는 것은 규칙에 따라 의미가있는 것처럼 보이지만 이름을 지정하면 메소드를 더 읽기 쉽게 만들거나 명확하게 만들 수 없습니다.
Brandin

2
프로그래밍은 "영어"가 아닙니다. 예를 들어, sqrt프로그래머가 인식하고 알아야 할 단어입니다. 그건 그렇고 영어 단어는 "제곱근"입니다. 그러나 영어의 자연스러운 것에 따라 이름을 짓는 것은 좋지 않습니다. 예를 들어 완벽하게 훌륭한 영어 단어 인 "불법"이라는 단어를 사용하십시오. 그러나 누군가 메서드 이름을 지정했다면 isIllicit이 메서드 호출을 볼 때마다 눈알을 찢어 내고 싶다고 생각합니다. 그것은 끔찍해 보이고 아이디어를 표현하는 더 좋은 방법이 있어야합니다.
Brandin

18
sum이 상황에서 잘못 들립니다. .net을 선호합니다 AddDays.
코드 InChaos

3
@LuigiCortese 메소드 이름은 일반적인 영어 단어 순서와 일치하도록 선택됩니다. Math.addExact(1, 2)"add 1 and 2"라고 말했기 때문입니다. tomorrow.plusDays(2)"내일 더하기 2 일"이라고 말했기 때문입니다. 경우 addExact의 일원이었다 Integer어떻게 든했을 것이다 1.plusExact(2).
Tavian Barnes

8
개인적으로, 나는 plusDays새로운 날짜를 x 일 동안 미래로 되돌릴 것으로 예상 되는 반면, addDays나는 원래의 객체를 변형시킬 것으로 기대할 수 있습니다. 그래도 나는 단지 자바에 익숙하지 않다.
Ajedi32

답변:


52

내가 생각할 수있는 유일한 이유는 날짜가 변경 불가능한 객체이기 때문에 plusDays를 호출하면 원래 객체에 요일을 추가하지 않고 새로운 속성을 가진 새로운 객체를 생성하지만 매우 다양합니다.

이것이 바로 그 이유입니다. 일정을 잡기 위해 날짜 범위를 조작하기 위해 일종의 API가 있다고 상상해보십시오. 다음과 같은 문장을 만들 수있는 메소드가 노출 될 수 있습니다.

var workdaySchedule = initialSchedule.withoutWeekends();

이것은 "평일 일정은 주말없는 첫 일정"이라는 영어 문장과 매우 ​​유사합니다. 초기 일정을 변경 하는 것은 아니며 작업 일정이 다른 새로운 일임을 암시합니다.

이제 이름이 다음과 같이 상상해보십시오.

var workdaySchedule = initialSchedule.removeWeekends();

혼란 스럽습니다. 초기 일정이 수정됩니까? 우리가있는 것처럼 소리 때문에 확실히, 그것은 같은 소리 제거 그것에서 주말. 그러나 왜 우리는 그것을 새로운 변수에 할당합니까? 이 두 가지 명명 체계는 매우 유사하지만이 문제는 현재 상황을 훨씬 덜 명확하게 보여줍니다. 초기 일정을 변경하고 void를 반환하는 경우 더 적합합니다. removeWeekends 경우 withoutWeekends혼란스러운 옵션이됩니다.


이것은 본질적으로 선언적 대 명령 적 구별입니다. 우리 그것이 workdaySchedule특정한 것임을 선언 하고 있습니까 , 아니면 그 특정한 것을 만들기 위해 명령적인 명령 ( "제거"와 같은) 목록을 수행하고 있습니까? 일반적으로 값을 변경하는 경우 명령 이름 지정이 더 의미가 있으며 위의 예에서 볼 수 있듯이 선언적은 변경 불가능한 값에 더 적합합니다.

귀하의 경우에는 똑같은 것이 있습니다. 내가 보았을 때 : tomorrow.plusDays, 그것이 tomorrow돌연변이되고 있다고 상상하지는 않지만 tomorrow.addDays, 나는 그것이 아닐지도 모른다고 생각합니다. 이것은 다소 미묘하지만 반드시 나쁜 것은 아닙니다. 너무 어렵게 생각할 필요없이,이 이름은 자연스럽게 당신이 돌연변이 여부에 따라 올바른 라인을 따라 생각을 설정합니다. 명령형 스타일과 선언적 스타일을 구분하기 위해 "add"(및 "remove")는 동사 인 반면 "plus"(및 "without")는 전치사 입니다.


13
사실에 문제가 있었다 addDaysplusDays어제! .NET에서 DateTime클래스에는 addDays, addMonths및 이라는 메소드가 있습니다 addYears. 상대 날짜 (1 년, 2 개월, 3 일 전)를 파싱하는 방법을 만들고 현재 DateTime객체를 수정한다고 생각하는 앞에서 언급 한 방법을 호출했습니다 . 데이터베이스의 모든 날짜는 2015 년 6 월 8 일로 끝났습니다. 그때 객체를 addDays수정하지 않고 새로운DateTime 객체를 반환 한다는 것을 기억했습니다 . 이 질문에 +1이 있습니다.
Greg Burghardt 2016 년

1
@GregBurghardt .NET 사용자로서 나는 정확히 반대되는 기대를 가지고 있습니다. 나는 "플러스"와 "추가"입니다 교환, 직접적인 매핑에 있음이 유일한 수단을 생각 +하고+=
Agent_L

2
@Agent_L 흥미 롭습니다. "add"와 "plus"는 영어로 교환 할 수 없습니다.
Ben Aaronson

1
또한 날짜와 시간의 경우 특정 원점 (우주 비행 T-10, T-9 등)과 관련된 시간을 기준으로 D + 1, H + 12 등을 말하는 것이 일반적입니다. 일반적으로 이것은 D-plus-1, H-plus-12, T-minus-10으로 읽습니다. 아마도 미국 중심 일지 모르지만 그것이 나에게 나타나는 방식입니다.
Kristian H

4
Jon Skeet의이 오래된 StackOverflow 질문이 흥미로울 것입니다. 불변 컬렉션에서 변경 불가능한 "추가"방법의 가장 좋은 이름은 무엇입니까? .
MicSim 2016 년

2

.NET에서는 결과가 정확히 동일하지만 이름이 다릅니다. 대신에:

tomorrow = LocalDateTime.plusDays(1);

있습니다 :

tomorrow = DateTime.Now.AddDays(1);

이것은 단지 "플러스"와 "추가"에 대한 이해의 차이가 개인적인 견해의 문제로 끝났다는 것을 의미합니다. 힘내십시오, 당신은 혼자가 아닙니다, 적어도 당신에게 더 매력적인 언어를 선택할 수 있습니다 :)


-1

이것은 아마도 .Method객체를 수정하는 메소드와 그렇지 않은 메소드를 모두 사용 하는 Java의 인공물 일 것입니다 .

언어 상상 object=>method줄 것입니다 구문 method에 일할 수있는 객체의 복사본을. 이제 그러한 언어 startDate=>plusDays(5)로 명확하게 모호하지 않습니다. 원래 날짜가 걸리고 5 일 후에 새 날짜가 작성됩니다.

관련이없는 메모에서는 sumDays여기에 의미가 없습니다. LocalDate시간 인 ,없는 시간 지속 . 기간은 얼마든지 합산 할 수 있으며 (결과는 다른 기간 임), 시점과 기간을 추가 할 수 있지만 (결과는 다른 시점 임) 시점을 합칠 수는 없습니다.

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