トップ «前の日記(2012-07-20) 最新 次の日記(2012-07-24)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2012-07-21

_ 定数より関数

直定数ではなく定数を使えという初歩的な教えがあるが、それは2つの意味がある。

1つは誰でも気付く凝縮性の問題で、次のプログラムを直すのが面倒だとわかれば定数のありがたさは気付く。

if (credit_limit > totalSales * 1.05) {
  ...
}
paymentSystem.requestValue = totalSales * 1.05;
 ..

しかし、みんなが大好きEclipseじゃなくても良いけどファイル串刺し置換で、1.05を1.08に変えれば済むじゃんと言えばそのとおりで、別に、static final double /*そもそもそれは間違いだろうというのは面倒なんでおいておくとして*/ JapaneseConsumerBias = 1.05; となっているのを1.08に変えることと意味はまったく変わらないのでどうでも良いといえばまったくどうでも良い。(その回りを固める丸め方式の差とか合わせて何個を越えたらどうするこうするみたいなビジネスロジックのほうがよほど重要なわけだ)

もう1つは本当に重要で、特にインテリセンス(コンテキスト補完)で役に立つし、そうでなくてもコンパイルエラーでわかるタイポ防御系。

if (abc == "abcdehij") { // 面倒なのでJavaではなくてC#ということにするけど{}はJava
  abc += "ekijelijww";
} else if (abc == "ekijelijww") {
  abc = "abcdehij" + abc;
}

みたいなのをタイポなしに書けるとしたら逆に打ち込み速度の向上をまず考えていただきたい。というわけで

const string abcdehij = "abcdehij";
const string ekijelijww = "ekijelijww";
...
if (abc == abcdehij) {
  ...

とすべき。命名規約はこの話題ではない。

どちらにしても、そのよって立つ意味は、いかにタイポなく素早く書けるかとか、ひとたび問題あればドミノ倒しで修正できること、それからどこでそれを使っているか検索一発(命名規約が含まれる)だ。

というわけで、次の2つのうち、前者をOKとするソース上っ面検査システムは、ゴミとしか言えませんな。

// 仏もどきを作って魂がまったく入っていない
const int YearStart = 0;
const int YearLength = 4;
const int MonthStart = 4;
const int MonthLength = 2;
 ... 
var beginDate = new DateTime(int.Parse(begin.SubString(YearStart, YearLength)), 
                             int.Parse(begin.SubString(MonthStart, MonthLength)),
          ...);
...
var endDate = new DateTime(int.Parse(end.SubString(YearStart, ...);

に対して

// われ神仏にたのまず
var beginDate = DateStringToDateTime(begin);
var endDate = DateStringToDateTime(end);
...
DateTime DateStringToDateTime(string yyyymmdd)
{
    return new DateTime(int.Parse(yyyymmdd.SubString(0, 4)),
                        int.Parse(yyyymmdd.SubString(4, 2)),
                        int.Parse(yyyymmdd.SubString(6, 2));
}

2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|

ジェズイットを見習え