次のような1つのライナーを拡張する必要があると感じた場合
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);
まだ読みにくいです。どうして?2つの問題を解決し、4番目の問題を導入します。
濃い
一部のデバッガーは、一度にすべてを強調表示するだけです
- わかりやすい名前はありません
- わかりにくい名前が散らばっている
新しい、良い、セマンティックな意味を追加する名前でそれを拡張すると、さらに良くなります!良い名前は私が理解するのに役立ちます。
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
あなたが単に良い名前を考えることができないので、私はあなたに私たちに無意味な名前の混乱をspareしみ、いくつかの古き良き空白を使用してそれを広げることを本当に望みます:
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()
呼び出しはそれぞれの行にあるため、このスタイルではmainの問題のある呼び出しに直接アクセスできるのは良いことだと思います。
そのため、問題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()
;
ご覧のとおり、このスタイルは、オブジェクト指向空間に移行しつつある機能的なコードとうまく機能することがわかりました。中間のスタイルでそれを行うために良い名前を思い付くことができれば、あなたにもっと力があります。それまで私はこれを使用しています。ただし、いずれにしても、意味のない結果名を避ける方法を見つけてください。彼らは私の目を傷つけます。