【ちゃんなるぶろぐ】社会人1年生が日々の学びをアウトプット!

>>> 読書・遊び・プログラミング・アプリ開発などを通して学んだことを、文章という形で出力 <<<

3分でわかる!「プログラマが知るべき97のこと」その①⑨

読み終えるまで約3分

 

 

どうも、ちゃんなるです! 

今日も”デキる”プログラマになるべく勉強していきましょう!

 

今回は、次の書籍の一部を要約します。

プログラマが知るべき97のこと』

 

下の記事の続編です↓↓

chan-naru.hatenablog.com

 

 

今回選択した3つのテーマ

本書はタイトル通り97のことについて書かれています。

今回は、55~57番目の項目についてまとめます。

  1. 並行処理に有効なメッセージパッシング(No. 55)
  2. 未来へのメッセージ(No. 56)
  3. ポリモーフィズムの利用機会を見逃さない(No. 57)

 

①並行処理に有効なメッセージパッシング

このテーマで述べられていたことは、

「共有メモリを使わずメッセージパッシングを使ってプログラミングをすることが、現在のコンピュータハードウェアにはどうしても必要な並行 / 並列処理にとって最も有効な方法である。」

ということです。

 

以下、要約です。

並行処理(特にその一種である並列処理)は、非常に難しいものと考えられています。

また「変数へのスレッドセーフな並行アクセスは難しい」といったこともよく話題になります。

 

この問題の根本は、「共有メモリ」であるという結論に達します。

共有メモリ:色々なプログラムからアクセス可能になっている、メモリ領域のこと)

並行処理に関する問題には、競合状態、デッドロック、ライブロックなどがありますが、そのほとんどが可変メモリの共有に関係しています。

デッドロック:複数の実行中のプログラムが、互いに他のプログラムの結果待ちとなり、待機状態に入ったまま動かなくなる現象のこと

ライブロック:複数の実行中のプログラムが、お互い相手のプログラムを完了させるために待機状態に入ってしまい、その後再開し、またお互いに待機状態に…という無限ループのこと)

 

この問題を避けるには、並行処理、メモリ共有のどちらかをやめましょう

並行処理を止めることはあり得ないでしょう。

なので、メモリ共有をやめましょう

代わりにプロセスメッセージパッシングを使うのです。

(プロセス:ここでは、他から保護され独立した状態の実行コード、という意味)

 

現在システム開発の主流となっているC、C++JavaPythonといった言語はどれも、共有メモリ、マルチスレッドのシステムに対応した言語です。

なので、プロセスモデル、メッセージパッシングに対応したライブラリやフレームワークを利用(なければ作る)ことが重要です。

 

可変メモリの共有をいかに抑えるか、がポイントですね。

 

 

②未来へのメッセージ

このテーマで述べられていたことは、

「自分の書くコードは、全部、未来の誰かへのメッセージだと思うべき。」

ということです。

 

以下、要約です。

「取り組む問題が難しければ、その解決策も難しくてわかりにくいものになる」と考える人が多いでしょう。

問題が難しいから、そのソリューションは難しく、保守も難しいものになって仕方がない、という考えです。

 

しかし、確かに解決策は難しいかもしれませんが、それを『伝わりやすいコードで表現する』ことは可能でしょう。

自分の書いたコードは、それが使われている限り、誰かの目に触れます。

そのため、自分の書くコードは、全部、未来の誰かへのメッセージと思って書くべきなのです。

 

 

ポリモーフィズムの利用機会を見逃さない

このテーマで述べられていたことは、

「コードの中にif-then-elseブロックになっている箇所があるのなら、その全てについてポリモーフィズムが使えないか検討するべき。」

ということです。

 

以下、要約です。

ポリモーフィズムとは、「同じクラスのオブジェクトやメソッドが、複数の形を取り得ること」を意味します。

ポリモーフィズムをうまく活用すると、オブジェクトやメソッドの特性、動きを、コンテキストに応じて細かく変えることができるのです。

さらに、そのために冗長なif-then-elseブロックを書く必要がなくなります。

 

例えば、「商品を物理的、またはダウンロードで配送する」という場合…

ポリモーフィズムではない表現

if (shippingType == .surface) {

    // 物理で配送する処理

} else if (shippingType == .download) {

    // ダウンロードで配送する処理

}

 

ポリモーフィズムの表現

・Itemクラス(正確にはインタフェース)にshipメソッドを呼ぶ処理を委譲する

・物理かダウンロードかは、Itemクラスが決定する

 

public class SurfaceItem implements Item {

    public boolean ship(Shipper shipper, Customer customer) {

       shipper.ship(this, customer.getSurfaceAddress); // 物理で配送する処理

    }

}

 

public class DownloadableItem implements Item {

    public boolean ship(Shipper shipper, Customer customer) {

       shipper.ship(this, customer.getEmailAddress); // ダウンロードで配送する処理

    }

}

 

 

まとめ

①並行処理は重要であるが、それ固有の問題があるのは事実です。これを抑えるために、プロセスやメッセージパッシングを駆使して「可変メモリの共有」を無くしましょう!

②解決策が伝えにくいような難しい問題でも、その解法のプログラムコードを書く際は、相手に伝えることを念頭に置くべきです。

③if-then-elseのあるところをポリモーフィズムに置き換えて、if-then-elseブロックの削減、ひいてはバグ削減可読性向上に努めよう!

 

*より深く知りたい方は、ぜひ本書を手にとってみてください!

書籍情報

プログラマが知るべき97のこと [ ケブリン・ヘニー ]

価格:2,090円
(2021/5/13 11:12時点)
感想(1件)

【中古】 プログラマが知るべき97のこと /ケブリンヘニー【編】,和田卓人【監修】,夏目大【訳】 【中古】afb

価格:825円
(2021/5/13 11:12時点)
感想(0件)

【書籍名】プログラマが知るべき97のこと

【著者名】ケブリン・へニー、夏目大(訳)

【出版社】オーム社

【出版日】2010年12月

【ページ数】243ページ

 

ポリモーフィズムわからなかった、という人のために

webpia.jp