IT ニュース&コラム 2018/10/ 8 通巻773号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ 名前付き引数が使えないときの説明引数 - リーダブル コード(54) ■■ 関数を呼び出すときに、引数を複数並べる代わりに、引数の名前も一緒に指定することを 名前付き引数と呼びますが、その名前付き引数を使うとコードが理解しやすくなります。 しかし、名前付き引数が使えない言語は、まだ多数あります。 名前付き引数が使えない 言語でどのように記述すればよいかを説明します。 C# での名前付き引数を使わない関数呼び出しの例: DrawBar( 100, 10 ); C# での名前付き引数を使った関数呼び出しの例: DrawBar( Length: 100, Width: 10 ); C# での関数定義の例: void DrawBar( int Length, int Width ) { ... } 名前付き引数が使えない言語で関数を呼び出すときは、引数に対する説明変数を使います。 C言語の場合、変数宣言が必要になりますが、そのときは、 なるべく狭い { } ブロックの中で宣言します。 int main() { : /* DrawBar */ { int length = 100; int width = 10; DrawBar( length, width ); } : } 上記の例では、length と width が説明変数です。 説明変数は、プログラミング言語の 機能ではありません。 コードを読む人にデータの意味を説明するために定義した 普通の変数のことです。 書き方のポイントは、 ・インデントの前の行に、関数名のコメントがあること ・関数呼び出しの前の行が空行であること ・必要なければ名前付き引数(説明変数)にしないこと 最後の、すべての引数を説明変数にしないことは、とても重要です。 たとえば、 機械的にすべての引数を説明変数にすると、以下のようになります。 /* DrawBar */ { int length = 100; int width = 10; int flags = 0; char* color = "Green"; DrawBar( length, width, flags, color ); } しかし、次のように書かれているほうが、読む量が少なくて速く読めます。 /* DrawBar */ { int length = 100; int width = 10; DrawBar( length, width, 0, "Green" ); } 0 は何?と気になる人もいるかと思いますが、そこに書いてあることを機械的に 重箱の隅をつつくように、すべて理解しようとするクセがある人が陥る回り道です。 おそらく 0 は、オプションを何も指定しないための記述なので、それを理解する 必要はありません。 何も指定していないのですから。 しかし、0は、変数や マクロになっていないからという機械的な判断で、マジックナンバーだ!、 と指摘する人がいるでしょう。 理解する必要がないのに。 その 0 は、省略可能な引数(デフォルト引数、オプション引数)が使える言語では、 省略されます。 省略されている引数があるかどうかチェックしますか? そのチェックがないと 問題が発生しますか? 省略可能な引数という機能自体が問題ですか? 省略可能な引数は、SEC M1.1.1「使用しない関数、変数、引数、ラベルなどは 宣言(定義)しない」の思想にも合致します。 個別の設定は理解できると思いますが、すべての設定の組み合わせを統合したときの 意味を人間は理解できません。 マジックナンバー7±2では少なすぎます。 また、高機能であるほどオプションが増えますが、細かいオプションについて レビューする時に正しいことをチェックすることは、専門家でなければ難しくなり、 非常に効率が悪いです。 微妙な設定ほどミスも多くなります。 それよりも、 テスト プログラムで問題がないことをチェックするほうが効率的で品質も良く 早くリリースできます。 Java や C++ は、名前付き引数を採用していません。 その理由は、おそらく、 引数が適切でなかったときに、読みにくくなるからのようです。 Objective-C では、引数はすべて名前付き引数にしなければなりませんが、 名前がクドすぎるという批判もあります。 appended = [aString stringByAppendingString:append]; Python では、名前付き引数が使えますが、標準ライブラリでは、 引数名が単語の区切りをしておらず2語以上の引数名に名前付き引数を使うと 読みにくくなります。 関数も2語以上の関数名は読みにくいです。 これでよく Python の設計者は「コードを読みやすくしましょう」と 言えるなと思います。 import calendar print( calendar.TextCalendar().formatmonth( theyear = 118, themonth = 10 ) ) その対策として、説明変数やコメントが使えます。 import calendar def Main(): #// FormatMonth the_year = 118 the_month = 10 print( calendar.TextCalendar().formatmonth( the_year, the_month ) ) #// FormatMonth Main() メソッド名は、Pascal ケース(単語の先頭文字は大文字で単語の間は _ を入れない) がよいでしょう。 なぜなら、リーダブル コード(50),(52) で説明したように、 メソッド名はグローバルのスコープであり、マニュアルを検索することがよくあるからです。 マニュアルを検索するときは、大文字小文字を区別しないので、「FormatMonth」で Python 公式ホームページを検索してもヒットします。 名前付き引数を使うと引数の順序が変えられますが、説明変数を使った書き方でも もちろん対応できます。 ただ、順序を変えられることのメリットはあまりありません。 ありそうだという可能性は考えられますが、ほとんど遭遇していません。 { int length = 100; int width = 10; DrawBar( length, width ); } 参考: https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments https://docs.python.org/3.6/library/calendar.html?highlight=formatmonth ■■ 注目ニュース 一覧 ■■ ◇ Wikipediaが右派系のサイトを信頼性に欠けるとして情報ソースに使用することを禁止。 https://gigazine.net/news/20181005-wikipedia-bans-breitbart-source/ … その判断はWikipediaではなくレビューアーによって行われるべき。 ◇ UIテストの所要時間を10分の1にする試み、Raspberry Piのクラスタで並列実行。 https://www.publickey1.jp/blog/18/ui101raspberry_pi2018.html … 通信待ちが多い Web アプリなら、ラズパイを多数投入可能。 ◇ Windows Virtual Desktop 発表。Azureからクラウドサービスとして。 https://www.publickey1.jp/blog/18/windows_virtual_desktopazuremicrosoft_ignite_2018.html … クリーンな Windows でテストすることに使えそう。 ◇ レジなしストア Amazon Go を体験。狙いは省力化じゃなかった! https://www.watch.impress.co.jp/docs/news/1144072.html … クレームを入れて返金処理をすることもできる のがポイント。 ◇ Cookieをすべて削除してもGoogleのCookieが残ってしまうことが判明。 https://gigazine.net/news/20180926-chrome-cookie-left/ … かつてのマイクロソフトのような横暴さ。 ◇ スマートスピーカーの米国での保有率は24%、最多利用は音楽。 http://www.itmedia.co.jp/news/articles/1810/02/news060.html … アメリカでは大ヒットのスマート スピーカー。 ◇ Apple&Amazonサーバーが中国人民解放軍の実働部隊にデータを盗むチップを仕込まれたと報道。 https://gigazine.net/news/20181005-apple-amazon-supermicro-hack/ … 中国共産党の活動も自由にさせているIT企業。 ◇ 脳活動をモニターして熟練したスキルを持っているかどうかを判別する技術が開発される。 https://gigazine.net/news/20181006-assessing-skill-with-optical-nueroimaging/ … どの技能が不足しているのかを被験者が知らないと、不正に利用される。 ◇ なぜ出席不要のオンライン講義などの自主学習はうまくいかない場合が多いのか? https://gigazine.net/news/20181005-learn-your-own-pace/ … 最終テストの提出が必須ということが最低限必要なのでは。 ◇ 時給が上がったせいで月収が減るとAmazonの労働者が新賃金制度を批判。 https://gigazine.net/news/20181004-amazon-eliminate-monthly-bonuse-stock-grant/ … 最低賃金の引き上げを支持しますと宣言しながら、この不誠実さ。 ■■ ソフトウェアデザイン館 Sage Plaisir 21 ■■ ホームページ >>> http://www.sage-p.com/ メルマガ >>> http://www.mag2.com/m/0000083983.html ブログ >>> http://blog.livedoor.jp/sage_p/ ツイッター >>> http://twitter.com/Ts_Neko ダウンロード >>> http://www.sage-p.com/freesoft.htm サポート掲示板 >>> http://www.sage-p.com/kg_ban09/z6037C8.cgi 東日本大震災 >>> http://www.sage-p.com/saigai.html メール >>> ts-neko◇sage-p.com ←◇を@に変えてください 緊急メールは件名に「うどんメール」を付けてください。 このメルマガの登録・解除 - http://www.mag2.com/m/0000083983.htm