ソースコードと次元
作成日: 2024-01-14 | 更新日: 2024-01-15
プログラミングってありますやんか。いやめっちゃ初歩的な話やねんけどもな? 例えば、(1)fileAを読み込んで、(2)その内容を解析・変換して、(3)fileBに書き込む、みたいな処理があるとしますやんか。全部main関数に書いたら以下のようになりますやんな。
use std::io;
fn main() -> io::Result<()> {
// 0. コマンドライン引数の読み込みとか前準備
// ...
// 1. fileA のロード
// ...
// 2. 読み込んだ内容の解析・変換
// ...
// 3. fileB への書き込み
// ...
Ok(())
}
「// ...」のとこに具体的な処理内容が来るって考えてな。え? 読みづらい? シンタックスハイライト?? 黙れ!!!!! おまえたちは皆・・・大きく見誤っている・・・この世の実体が見えていない まるで3歳か4歳の幼児のように この世を自分中心・・・求めれば・・・周りが右往左往して世話を焼いてくれる・・・そんなふうに まだ考えてやがるんだ 臆面もなく・・・!
ほんでな、各段階ではそこでしか使わない一時変数がでてきますやんな。そうすると、他の段階で使わない変数が同じスコープにいると混乱の元なので、普通に考えて関数に分離しましょうってなって以下の感じになりますわな。
use std::io;
fn main() -> io::Result<()> {
// 0. コマンドライン引数の読み込みとか前準備
// ...
let data = load_file_a()?;
let processed_data = process_data(data)?;
write_to_file_b(processed_data)?;
Ok(())
}
fn load_file_a() -> io::Result {
// 1. fileA のロード
// ...
}
fn process_data(data: String) -> io::Result {
// 2. 読み込んだ内容の解析・変換
// ...
}
fn write_to_file_b(data: String) -> io::Result<()> {
// 3. fileB への書き込み
// ...
}
ここでな、疑問なんやけど、これだとload_file_a関数からprocess_data関数を呼び出したりとかできてしまうやんか。実際には全部mainから呼び出されるためだけの関数なのに、コード上ではその情報が欠落してて、分離した関数同士もお互いに依存しあえる(えっちだな…)状態になってるやんか。
これってこういうものとして諦めるしか無いんかな? これくらいわかるだろ、ってことなんかもしれんけどさ、こういうコード上で表現されない依存関係を脳のワーキングメモリに溜めていきながらコードを書いたり読んだりするのって、結構認知的に負荷かかると思うねんけどなって。
関数内関数にするとか、名前に「_for_main」みたいにつけるとか、やりようはあると思うねんけどな、でもそれやるか?って話やんな。どうなん? 誰か教えてください。ちなみにこのブログにはコメント機能など存在しないので何らかの方法でワイに連絡を取る以外教える方法はないけどな! ハハハハーッ!!
そういえば『A Philosophy of Software Design』って本で「最近の若モンはとにかくスコープを短くしようとしてやたらめったら関数とかに分離したりしとるけど、分離すればするだけ依存が増えて地獄になるんやで!」みたいなこと書いてたような気がするけど、そういうことなんかね(?)。
あ、ほんでな、ようはさ、これって実際には二次元でさ、mainに紐づく関数たちは兄弟関係なんやから、変な話mainの下に横一列に並べるのが正しいのに、単なるテキストファイルなので縦一列に並べるしかない、ってのが制約の実体な気がするんよな。
せやから、スプレッドシートのセルみたいな感じでさ、横にも伸ばせるエディタ(+ファイル形式)があったら面白いと思うんやけど、どう?
あと、これで思い出すのはPowerPointや。いやちょっと違うか、うん、ちょっと違うな。ちょっと違うんだけどさ、あれもさ、実際には各スライドはそれぞれがなにかのトピックに紐づいてるんだけど、縦一列に並べるしかないから、見る側は「あれ、今何についての話してるんだっけ?」ってなりやすいじゃん。で、なんかいつだったか、スライド資料を縦だけじゃなくて横にも並べられる、つまり並列する各トピックは横、同じトピックの中の一連のスライドは縦に並べられる、っていうWebアプリを見たことがある気がするんだけど忘れた。