IT ニュース&コラム 2020/ 4/13 通巻809号 技術版 ソフトウェアデザイン館 Sage Plaisir 21  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ■■ 手続き型プログラミング言語で宣言型プログラミングをする(2) ■■ 宣言型プログラミングを、手続き型のプログラミング言語で行ったとき、プロパティや メソッドにデータ定義を書くことで書く順序を自由にすることと、一度だけ呼び出す 関数にすることで副作用を無くすことと循環参照を警告することが必要になることを 紹介しました。 今回は、もう1つの問題の対策方法を紹介します。 言語は TypeScript で説明します。 class DataClass { A = CallOnceFunction(() => { return { Name: "A", B: this.B(), }; }) B = CallOnceFunction(() => { return { Name: "B", }; }) C = CallOnceFunction(() => { return { Name: "C", B: this.B(), }; }) } 上記のように(一度だけ呼び出す)メソッドを使ってデータ定義を書いたとします。 この場合、データは存在していません。 なぜなら、メソッドしか定義していないからです。 上記のコードを実行しても A は 呼ばれないので、A の中で生成するデータ(オブジェクト)は存在しません。 宣言型プログラミング言語では、書いただけデータが存在します。 条件分岐やコメントなどによって存在しないデータが書かれていることはありますが、 デフォルトとしては存在します。 一方で、手続き型プログラミング言語のメソッドでデータを定義した場合、デフォルト ではデータが存在せず、存在させるには、データを生成する必要と、一覧(リスト)に 登録する必要があります。 ちなみに、手続き型プログラミング言語でもメソッドではなく、グローバルなオブジェクト の中のデータで定義すれば存在します。 JSON のようなコードです。 その場合は以後の 対策をする必要はありませんが、他のメソッドの返り値を参照すること(例:上記の this.B())はできません。 すべてのデータの生成をする原始的な方法は、以下のようなコードになるでしょう。 const data = new DataClass(); data.A = data.A(); data.B = data.B(); data.C = data.C(); しかし、このコードは例外が発生します。 なぜなら、C() を呼び出したときは、B が メソッドではなくデータになっているので B() は関数ではないという例外が発生するからです。 data.C = data.C(); // 例外: B() は関数ではない その問題を回避するには、すべてのメソッドを呼び出してからデータを格納することです。 const data = new DataClass(); data.A(); data.B(); data.C(); data.A = data.A(); data.B = data.B(); data.C = data.C(); もう1つ問題があります。 それは、メソッドが増えたときに、メソッドを呼び出すコード (コール)も増やす必要があることです。 たとえば、DataClass の中に D() メソッドを 追加した場合、data.D(); と data.D = data.D(); を追加する必要があります。 これは地味ながら大問題です。 1つメソッドが増えたときに1つコールを増やすことは簡単です。 だから大した問題ではない と評価するのは大間違いです。 多くの人がコードを編集しているプロジェクトや、古い プロジェクトを編集しているときに、メソッドが増えたときにコールも増やさなければならない というルールを知らなかったり忘れたりした人は、メソッドだけ増やしてコールを増やさないで 完了としてしまう可能性が高いのです。 つまり、2か所以上の整合を取る(同期をとる)必要があるコードというのは、 不具合を簡単に生み出してしまう危険なコードなのです。 ただし、あるルールを採用すれば、同期をとるコードがあっても対応することができますが、 それはまた別の機会に話すこととします。 コードの同期をとる必要がなく、すべてのデータを生成するには、Object.keys を使います。 const data = new DataClass(); for (const key of Object.keys( data ) as Array ) { data[key](); // Calls all methods } for (const key of Object.keys( data ) as Array ) { data[key] = data[key](); // Change to data properties } データの内容は、以下のコードで表示できます。 console.log(data); // または console.log(JSON.stringify( data, null, '\t' )); // データを一覧で表示 以上のコードは 2020年4月現在の Visual Studio Code で動作確認しています。 JSFiddle/TypeScript では => を function() {}.bind(this) に修正することと、 as Array をコメントアウトする修正することが必要になります。 なお、これまでに説明した方法は、コードがデータのマスターになっているときの方法です。 もし、JSON などの宣言型プログラミング言語で定義するとき(手続き型プログラミング言語で データのマスターを定義しないとき)は、これまでに説明した方法ではなく、 JSON.stringfy に関連する toJSON メソッドで親子以外のオブジェクトの参照を削除し、 JSON.parse した後でオブジェクトの参照を復帰させる方法になります。 ■■ 注目ニュース 一覧 ■■ ◇ 東京都、テレワーク導入を検討している中小企業にノートPCなどを1カ月無償貸与。 https://japan.cnet.com/article/35151730/ https://japan.cnet.com/article/35151933/ https://japan.cnet.com/article/35152146/ … PCや書斎を持っていない世帯は多いからリモートワークの導入もためらいがち。 ◇ AppleとGoogleが新型コロナウイルス追跡システムをiOSとAndroidに組み込む。 https://gigazine.net/news/20200411-google-apple-coronavirus-tracing-system/ … 活動経路を追跡する技術。 プライバシーに配慮されていることも大事だが、虚偽申告への対策が最も難しそう。 ◇ ビル・ゲイツが新型コロナについてアメリカでは夏を待たず改善と回答、ワクチンの完成時期についても言及。 https://gigazine.net/news/20200410-bill-gates-talks-covid-19/ https://gigazine.net/news/20200407-next-outbreak-bill-gates/ … アメリカは6月頃に一度ある程度普段通りに戻るらしい。ワクチンの流通は18カ月後らしい。 ◇ あつまれ どうぶつの森が香港デモの参加者が感染を気にせず集まることができる新たな場に。 https://gigazine.net/news/20200410-animal-crossing-hong-kong-demo/ … 集会は善にも悪にもなるが、これだけネットが普及すると集会を禁止することはできなくなっていく。 ◇ プロセッサの例外処理を用いてマイコンの保護領域を読み出す手順が公開中、ソースコードもあり。 https://gigazine.net/news/20200329-break-stm32f1-read-out-protection/ … STM32F1/ARMv7-Mマイコンの保護機能の脆弱性。90%も漏えい。 ◇ AppleのSafariがサードパーティーCookieを完全にブロック、一般的なブラウザでは初。 https://gigazine.net/news/20200325-apple-safari-block-third-party-cookie/ https://gigazine.net/news/20170606-intelligent-tracking-prevention/ … 単純にクロスサイトをブロックしたらWebが使いにくくなるが、アップル独自の統計情報から判断。 ◇ めちゃくちゃ精度が高いと話題の機械翻訳DeepL翻訳に日本語の翻訳機能が登場したので実際に使ってみた。 https://gigazine.net/news/20200323-deepl-translator-japanese/ … 商業的にも成功してほしい。 ◇ マイクロソフト、Edge の Stable チャネルへのアップデートを一時停止。 https://japan.cnet.com/article/35151258/ https://japan.cnet.com/article/35151328/ … ユーザーにアップデートの作業よりコロナウイルス対策を。開発は続けると思われる。 ◇ Slack、Microsoft Teams Calls アプリのベータ版をリリース。 https://japan.cnet.com/article/35151767/ … 連携を深めてメニューを選べることで存在感が増す。 ◇ 新型コロナの研究にスパコン16台を開放。米国の産学官が連携。 https://japan.cnet.com/article/35151244/ … クラウドでは科学技術計算に適していない。 ◇ ソニー、新型コロナの影響--中国工場は順次再開、エンタメ分野に波紋。 https://japan.cnet.com/article/35151491/ … エンタメの影響とスマホの部品への影響。 ◇ アドビ、電子署名ツール Adobe Sign の無料期間を90日に延長。テレワーク支援で。 https://japan.cnet.com/article/35152217/ … 今の時期は、アウトソーシングなどの勉強期間とも。 ■■ ソフトウェアデザイン館 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