開発合宿 オブジェクト指向とCREATE テーブル
From 2019/9/22 Sun. to 2019/9/23 Mon.
我々は土曜日朝7:30に郡山駅前にいた。秋にやってくる二度目の3連休前夜の金曜日に突然思いついて、翌日からあるワークスペース併設の宿で開発合宿をすることにしたのである。前泊したメンバーと始発で到着したメンバーが合流し、宿のチェックインができる時間になるまで、駅前のコメダコーヒーで打ち合わせをして過ごすことにした。
O/RマッパーとしてSQLAlchemyを使うことにし、テーブルのデータ項目も決定した我々は、そのルールにしたがってプログラムをどのフォルダ階層に置くかというパッケージ構造を考える必要があった。パッケージ構造を考える上では、Pythonのオブジェクト指向としての仕様を確認した上で、クラスをどのように分割し役割を負わせるかというクラス設計を決め、それと整合性が取れるようにしなければならない。これがJavaで育った我々にとってはなかなか難解であった。
難儀したのが、オブジェクト指向言語としてのPython特徴についてであった。ガチガチにオブジェクト指向で制約が多いJavaと違い、Pythonはオブジェクト指向を取り入れつつもそうでない書き方もできるようだった。また、関数型言語と呼ばれる要素も含んでいるということだった。正直なところ、この辺のところは我々のこれまでの経験でも類推できず、いろいろ調べてみたもののついぞ理解できなかった。結局、これまでの経験を踏襲し、Model、View、CotrollerのMVCモデルと共通部品でパッケージを構成することにした。
オブジェクト指向に関する言語仕様の細かい差異にも悩まされた。クラスとインスタンスという概念をJavaでは文法的に明確に区別しているが、Pythonでチュートリアルをやっている過程には一切クラスの概念に出会わなかった。とはいえ、そういった考え方もあるようで、Webアプリを実装するにあたってはクラスとインスタンスを意識的に使い分ける必要があるように思われた。例えば、Javaではインスタンス生成を伴わないで呼び出すメソッドをstaticメソッドと呼び、それ以外はインスタンス生成を呼びだしの前提としている。一方のPythonでは、通常のメソッドとstaticメソッドもあるが、Javaにはないクラスメソッドという概念があるらしく混乱した。さらに、それぞれをアノテーションで指定することができる!なんと現代的な。
Javaでのデザインパターンを経験していた私たちは、同じようにPythonでもできると考えていたが、若干考え方を変える必要があることを知った。
宿にチェックインをすると、素敵なワーキングスペースがあった。だが、今回の合宿で我々に課せられたもう一つのノルマはそれに似つかわしくないひたすら単調な作業である。
必要となった全7テーブルを、それぞれ異なるテーブル間の項目同士の関連であるリレーションを整合性がとれた状態で、データベース参照ツールであるPGAdminを使ってheroku PostgreSQL上に構築する。データベースをひたすらエラーを潰しながら、CREATE TABLE文でheroku上に作成していった。さらに、SQLAlchemy上でのO/RマッパーであるModelクラスと整合性が取れた状態でプログラムを作成していく。
途中で耐えられなくなって、往復1時間かかるコンビニにブタメンを買いに行ったりしてしまった。さらにおいしい食事とビール、それに温泉が追い討ちをかける。ワーキングスペースが閉まったあともテーブル作成が全て完了するまで、眠気覚ましに冷房を20度に設定した部屋で開発を続けた我々であった。