8. Dennis さんに日本語訳を打診
• 将来、更新したらすぐに翻訳すること。
• そのまま訳す(literal translation)ならCodePlexでホスト
します。
• もし変更して独自のものを作るのであれば、インターネッ
トに公開してはいけません。
ただし明らかに日本の文化に合わないものがあれば(if you
think that makes sense) 若干の変更してもかまいません。
連絡・交渉
14. new キーワードは、ポリモーフィズムを壊す
サブクラスを理解することがより難しくなる。
public class Book
{
public virtual void Print()
{
Console.WriteLine("Printing Book");
}
}
public class PocketBook : Book
{
public new void Print()
{
Console.WriteLine("Printing PocketBook");
}
}
PocketBook pocketBook = new PocketBook();
pocketBook.Print(); // "Printing PocketBook "と出力される
((Book)pocketBook).Print(); // "Printing Book"と出力される
AV1010
継承メンバーを newキーワードで隠すべきではない
27. 記号定数以外に数値、文字列のどちらにもリテラル値を使用してはいけない。
例えば: public class Whatever
{
public static readonly Color PapayaWhip = new Color(0xFFEFD5);
public const int MaxNumberOfWheels = 18;
}
ログやトレースのための文字列はこのルールから除外する。文脈から意味が明
確な場合と将来変更される可能性がない場合にはリテラルを許可する。
例えば: mean = (a + b) / 2; // OK
WaitMilliseconds(waitTimeInSeconds * 1000); // 十分明確である
ある定数が他に依存している場合は、コード内で明示するようにする。
public class SomeSpecialContainer
{
public const int MaxItems = 32;
public const int HighWaterMark = 3 * MaxItems / 4; // at 75%
}
Note 記号定数を明らかにするために列挙型を使用することができる
AV1515
“マジック” ナンバーを使ってはいけない
28. LINQクエリの結果やステートメントからの型が確実に明確なと
きには、varを使うことによって可読性が向上する。そのため、
以下のようには使用しない。
var i = 3; // 型はなに? int? uint? float?
var myfoo = MyFactoryMethod.Create("arg"); // なにを期待しているのかが明確じゃない。
// ベースクラス? インターフェイス?
// また、クラスを探すことができないと
// リファクタリングが難しくなる
var は、以下のように使用する。
var q = from order in orders where order.Items > 10 and order.TotalValue > 1000;
var repository = new RepositoryFactory.Get<IOrderRepository>();
var list = new ReadOnlyCollection<string>();
上記3つの例では、期待している型が明確である。より詳細な
varによるメリット・デメリットは、Eric Lippert氏の 型推論を
使うかどうかを参照して欲しい。
AV1520
型が確実に明確なときにだけvarを使用する
29. 通常はbool型の式でtrue かfalseかを比較するためことはよ
くないスタイルである。例えば:
while (condition == false) // 間違えた、よくないスタイル
while (condition != true) // これも誤り
while (((condition == true) == true) == true) // どこまでいくの?
while (condition) // OK
AV1525
true やfalse を明示的に比較しない
30. Defaultブロックが空の場合は説明するコメントを追加する
到達することがない場合は、InvalidOperationExceptionを
スローする
void Foo(string answer)
{
switch (answer)
{
case "no":
Console.WriteLine("You answered with No");
break;
case "yes":
Console.WriteLine("You answered with Yes");
break;
default:
// ここで終わることはない。
throw new InvalidOperationException("Unexpected answer " + answer);
}
}
AV1536
常にswitch ステートメントの最後のcase の後にdefaultブロックを
追加する