この記事は「Elixir Advent Calendar 2023」23日目の記事です
東京にいるけどfukuokaexのYOSUKEです。
普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。
このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習 というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ!というノリで書いてみたいと思います。
なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第23回目です。
それでは、いくぞ!
c-4爆弾と安全性の担保
よーし、貴様ら関数でc-4爆弾を生成する仕組みの途中で判定処理やらリファクタリングやら、正規表現やら教えて横道にそれたが、まだc-4爆弾を生成する関数は完成してない。
今日は、続きを再開するぞ。いいか、貴様ら、知っての通りc-4爆弾の成分は扱いやすくするための成分を爆薬に追加しているに過ぎない。要するにRDXが危険物だが、ちょっとしたことで爆発していては扱いづらい、そこで追加の成分を入れて、簡単に爆発しないようにしてるわけだ。
そして、Wikiによると他の成分と分量がパーセンテージで記されている。これも同じc4を作成する成分なのでcreate_c4
で作れるようにしよう。
- RDX(トリメチレントリニトロアミン):91%
- 爆発物マーカー(ジメチルジニトロブタン):0.1%
- 可塑剤(セバシン酸ジオクチルなど):5.3%
- 結合剤(ポリイソブチレン):2.1%
- 界面活性剤:1.5%
引数のパターンマッチを2パターン作ることができる
defmodule TNT do
def create_c4({"RDX", rdx}, {"ポリイソブチレン", polyisobutylene}, {"モーターオイル", motorOil}, {"セバシン酸ジオクチル", dioctylSebacate}, {"ガソリン", gasoline}) do
materials = [rdx, polyisobutylene, motorOil, dioctylSebacate, gasoline]
Enum.map(materials, &convert_material_to_numeric/1)
end
def create_c4({"RDX", rdx}, {"ジメチルジニトロブタン", dimethyldinitrobutane}, {"可塑剤", plasticizer}, {"結合剤", binder}, {"界面活性剤", surfactant}) do
materials = [rdx, dimethyldinitrobutane, plasticizer, binder, surfactant]
Enum.map(materials, &convert_material_to_numeric/1)
end
defp convert_material_to_numeric(material) do
numeric_part = String.replace(material, ~r/[gml%]/, "")
convert_to_numeric(numeric_part)
end
defp convert_to_numeric(numeric_part) do
if String.contains?(numeric_part, ".") do
String.to_float(numeric_part)
else
String.to_integer(numeric_part)
end
end
end
いいか、貴様らこのように引数のパターンマッチで作成した場合は、同じ引数の数での同じ関数名で作成することができる
TNT.create_c4({"RDX", "91%"}, {"ジメチルジニトロブタン", "0.1%"}, {"可塑剤", "5.3%"}, {"結合剤", "2.1%"}, {"界面活性剤", "1.5%"})
[91, 0.1, 5.3, 2.1, 1.5]
また、今回、ジメチルジニトロブタンは爆発物マーカーとして入れてるに過ぎない。逆にマーカーをしないで生成するパターンも作る事にしよう。
def create_c4({"RDX", rdx}, {"可塑剤", plasticizer}, {"結合剤", binder}, {"界面活性剤", surfactant}) do
materials = [rdx, plasticizer, binder, surfactant]
Enum.map(materials, &convert_material_to_numeric/1)
end
このように同じ関数名で作成することができる。
TNT.create_c4({"RDX", "91%"},{"可塑剤", "5.3%"}, {"結合剤", "2.1%"}, {"界面活性剤", "1.5%"})
[91, 5.3, 2.1, 1.5]
これで、この関数を利用するものは、c4爆弾を様々な方法で作成することができるようになったわけだ
いいか、聞け貴様ら!こんなにも素晴らしい関数名を同じにする理由をそのnil頭に叩き込め!
まず、一つの関数名で複数のパターンマッチをすることで、同じ目的のための異なる材料や条件に柔軟に対応できるんだ。これがどれだけ効率的か、理解できるか?まるで、同じ銃で異なる弾薬を撃つようなものだ。戦場では状況に応じて装備を変えるが、この関数はそれを一つの枠組みでやってのける。
さらに、この方法はコードの可読性と保守性を高める。貴様ら、戦場での命令が一貫していることの重要性はわかるな?同じ関数名を使うことで、その関数が何をするのか一目でわかる。そして、似たような機能を持つ関数が別々に存在するよりも、一つの関数にまとめる方が、後でコードを修正する際にも迷わずに済む。
そしてな、これによって再利用性が高まるんだ。同じ関数を異なる引数で呼び出すだけで、さまざまな結果を得ることができる。これはまるで、多目的な軍用ナイフのようなものだ。一つで多くの仕事をこなす、そういうわけだ。
最後に、このアプローチはバグのリスクを減らす。なぜなら、一つの機能に関連するコードが一箇所に集中しているからだ。修正する際にも、一箇所を直せばいい。これは、戦場での防御戦略と同じだ。要点を一つに絞れば、防御しやすくなる。
だから、貴様ら、この関数の重要性を忘れるな!これはただのプログラミング技法ではない。これは戦略だ!戦略と効率の極みを見せつけるための方法だ!
今日はここまで、それでは次回 Part24でまた会おう!