만약 당신이 하나의 라이너를 확장해야한다고 느꼈다면
a = F(G1(H1(b1), H2(b2)), G2(c1));
난 당신을 비난하지 않습니다. 그것은 읽기가 어렵고 디버깅하기가 어렵습니다.
왜?
- 조밀하다
- 일부 디버거는 한 번에 전체를 강조 표시합니다
- 설명적인 이름이 없습니다.
중간 결과로 확장하면
var result_h1 = H1(b1);
var result_h2 = H2(b2);
var result_g1 = G1(result_h1, result_h2);
var result_g2 = G2(c1);
var a = F(result_g1, result_g2);
여전히 읽기가 어렵습니다. 왜? 두 가지 문제를 해결하고 네 번째 문제를 소개합니다.
조밀하다
일부 디버거는 한 번에 전체를 강조 표시합니다
- 설명적인 이름이 없습니다.
- 설명이 아닌 이름으로 어수선합니다
새롭고 좋은 의미 의미를 추가하는 이름으로 확장하면 더 좋습니다! 좋은 이름은 이해하는 데 도움이됩니다.
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
적어도 이것은 이야기를 말해줍니다. 그것은 문제를 해결하고 여기에 제공된 다른 것보다 분명히 낫지 만 이름을 생각해 내야합니다.
당신은 같은 의미의 이름으로 할 경우 result_this
와 result_that
단순히 좋은 이름을 생각할 수 없기 때문에 나는 정말 원합니다 당신은 우리에게 의미 이름의 혼란을 절약하고 좋은 오래된 공백을 사용하여 확장 :
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
의미없는 결과 이름을 가진 것보다 더 읽기 쉽지만 읽을 수 있습니다 (이러한 함수 이름이 그렇게 큰 것은 아닙니다).
조밀하다
일부 디버거는 한 번에 전체를 강조 표시합니다
- 설명적인 이름이 없습니다.
설명이 아닌 이름으로 어수선합니다
좋은 이름을 생각할 수 없을 때 얻는 것만 큼 좋습니다.
어떤 이유로 디버거는 새로운 줄을 좋아 하므로 디버깅이 어렵지 않습니다.
그것으로 충분하지 않다면, G2()
여러 곳에서 호출되었다고 상상해보십시오 .
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
각 G2()
통화가 자체 회선에 있기 때문에이 스타일을 사용하면 기본적으로 문제가되는 통화로 바로 연결됩니다.
따라서 1 번과 2 번 문제를 4 번 문제의 원인으로 삼지 마십시오. 생각할 때 좋은 이름을 사용하십시오. 할 수 없으면 의미없는 이름을 피하십시오.
Orbit의 의견 에서 Lightness Races는 이러한 기능이 인위적이고 나쁜 이름 자체를 가지고 있음을 올바르게 지적합니다. 다음은이 스타일을 일부 코드에 적용하는 예입니다.
var user = db.t_ST_User.Where(_user => string.Compare(domain,
_user.domainName.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
.Where(_user => string.Compare(samAccountName, _user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase) == 0).Where(_user => _user.deleted == false)
.FirstOrDefault();
줄 바꿈이 필요하지 않은 경우에도 그 소음 흐름을 보는 것이 싫습니다. 이 스타일에서 어떻게 보이는지는 다음과 같습니다.
var user = db
.t_ST_User
.Where(
_user => string.Compare(
domain,
_user.domainName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(
_user => string.Compare(
samAccountName,
_user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(_user => _user.deleted == false)
.FirstOrDefault()
;
보시다시피,이 스타일은 객체 지향 공간으로 이동하는 기능 코드와 잘 작동합니다. 중간 스타일로 좋은 이름을 내면 더 많은 힘을 얻을 수 있습니다. 그때까지 나는 이것을 사용하고 있습니다. 그러나 어쨌든 의미없는 결과 이름을 피할 수있는 방법을 찾으십시오. 그들은 내 눈을 아프게합니다.