僕が作ったリポジトリ
2年前ぐらい(めちゃくちゃPython初心者の頃)に、
「へ〜PythonでLINEのボット作れるんだ〜」
となって、見よう見まねで書いたコードをGitHubのプライベートリポジトリに
あげてRenderにデプロイしました。友達に教えたら結構遊んでもらえて嬉しかったです。
しかし!
あまりにもクソコードなのです!
そりゃ、その頃はおそらくstr.joinすら知らないので、
かなり無茶苦茶なコードを書いているんです。ということで、
過去の自分が書いたコードをレビューしていきます。
その1: ゲーム中であるかどうかをbool値で管理していない
なんで数字にしたんや...
考えられる原因としては、
- Pythonでbool値の先頭を大文字にすることを知らなかった
- bool値で分岐ができなかった
だと思います。
その2: 変数が日本語
しかも直書き。(だってその頃with文使えないもん)
list[tuple]にすれば置き換えとかは短縮できるので、今書くなら
そうすると思います。
あと、何気にひらがなとカタカナの対応表を自力で書いたのはすごい...
ちなみに、ボットが使える単語はだいぶ限られていて、
理由は「スクレイピング技術がないから」。しりとり.netさんから単語リストを
使わせてもらってたのですが、それも全部手動なのでかなり効率と語彙力が悪いです。
その3: globalが多すぎる
これは、
global tango, game, henkan, 最後の文字, count
と書けるので、わざわざ冗長にする必要はあまりないと思います。
(見た目的にわざとそうすることもあるかもしれないです。知らんけど)
その4: event.message.text[len(event.message.text) - 1]ってなんやねん!!!
負の値でインデックスを指定すれば末尾から文字が取れるということを
知らなかったようです。あとここでも、タプルを使えば
if event.message.text[-1] in ("ん", "ン"):
...
だいぶ短縮できます。
その5: 二重表現??
訳すと: 「あなたの負け! あなたの負け!」
人の心のないボットですね。ボットに人の心はないだろ
その6: それ以降は読めなかった
ほんとなんです。僕が疲れてるだけかもですが、ほんとに読めないんです。
特にこの辺り。
その7: 勝てない
人間は同じ単語が使えないのに、あっちは同じ単語を使い放題なんですよ
(語彙力がないため、そうしないと成り立たない)
プレイヤーの単語の末尾が"ぢ"の場合の挙動もあったっぽいですが、
ちゃんと読めなかったです。(おい)
改善するとしたら?
絶対にクラス定義を使います。
あと、よく考えたらこのコード、複数人が同時にボットに話しかけたらバグりそうなので、
class ShiritoriBot:
...
を作って、
bot_objects: dict[str, ShiritoriBot] = {}
みたいな感じで、ユーザーごとに、ボットのインスタンスを分けられる設計にします。
あとは、定数は英語の大文字で書くようにしたり、外部ファイルにデータを置いたり、
伸び代しかないですね。
もしかしたら改善版コードも作るかもです。
最後まで読んでいただきありがとうございます。