【Console Application】ファイルとデータベース 185【学習記】
ファイルとかデータベースの話🤤
→参考コード書いてたら思ったよりノってしまって時間がなくなるなど🙄
DBControllerBase
いよいよ重要な DB 操作クラスの移植よー🤤
Csv は基本テキストを読み書きするだけじゃなく、一応 Csv の書式に整形するという機能を持たせるのでそこがちょっと複雑だったのよね🤔
最初に作った時はログ記録用だったので整形と書き出ししか無かったわけだけど今回は「バッチ処理の情報源」として読込みと解析が必要になりそこが複雑さの象徴だったかな🤤
Record は単純に DB での1項目の情報をクラス化しただけなので Csv よりも平和な移植だったかな🤔
で、この DB も Csv みたく整形するのにちょっと文になるから手順が増えるってだけで難易度的には Csv と余り違いが無いのよね、本来は🤔
DB で一番むずかしいのは Record を継承して定義される「アプリ用レコード定義クラス」を「 DB クラス内でその名前を参照せずにインスタンス生成を可能にする」方法😑
単純に呼び元で生成して渡せば処理は簡単なんだけど使う側として「そんなの DB クラス側でやってよ」ってなるよね🙄
Record 継承してるから Record へキャストしておけば基本機能だけで取り回しができるので DB 側で継承先のクラス名を参照しないで Record として扱えればどのアプリ開発でも使用できる「ライブラリ」になるよねって話🤤
継承先の名前を DB 側で書いたら、使う時毎回書き換えが発生するのでアウト😞
DBA でやってるけれど今回移植にあたって Java の version 違いによる API の統廃合の影響で書き換えをして、もうちょっとだけ頑張るとクラス名を文字列で入れないでインスタンスを1つ渡すだけで書き換えられるところまでは来てるけどそこまでやってなくて Kotlin でもその状態のライブラリを移植する事になるのよね🤔
Kotlin 学習者の求める処理方法ではないなと思うけどこういう発送が生まれるのも他の言語を触っているからかなと思う🤤
これ、 JS だと単にクラスオブジェクト渡して DB 内で new するだけなのよね🙄
// JS ならこんな
// RecordElement
val ELEMENT = function(columnData=[])
{ //セル1枡分
/* 内部メンバに配列columnDataの内容を設定する */
return this;
};
ELEMENT.prototype.値を設定する処理 = function(cellData=""){/* 設定する処理 */};
// Record
val BASECLASS = function()
{
this.line = []; // これが埋まるとやっと1行分
return this;
};
BASECLASS.prototype.addElement(columnData=[])
{
this.line.add(new ELEMENT(columnData)); // 列を埋めている
};
BASECLASS.prototype.setData(cellData=[])
{
// ホントは line と cellData の個数が合ってるか処理しないとダメ
for(var i=0 ; i<cellData.length ; i++)
this.line[i].値を設定する処理(cellData[i]);
};
// Extends Record
val EXTCLASS = function()
{
this.addElement(["name","","string"]);
this.addElement(["addr","","string"]);
this.addElement(["phon","","string"]);
// ...
return this;
};
EXTCLASS.prototype = Object.create(BASECLASS.prototype);
// このクラスで "EXTCLASS" の名前を使うと負け
val CTRLCLASS = function(recordclass=Object) // main から EXTCLASS が入ってくる
{
this.record = []; // ここでやっと1要素1行
this.recordclass = recordclass; //括弧無しがミソ
return this;
};
CTRLCLASS.prototype.addRecord(recordData=[])
{
val cell = new this.recordclass(); // オブジェクトの名前が分からなくても new できる
cell.setData(recordData); // cell instanceof BASECLASS == true
this.record.add(cell); // ただの配列の標準操作
};
// main.js
// import EXTCLASS;
// import CTRLCLASS;
val main = function()
{
val ctrl = new CTRLCLASS(EXTCLASS);
ctrl.addRecord("開発太郎","開発市開発3-4-5","○△Σ○-□Γ☆▽");
// ...
};
main();
JS 以外の言語は型厳守なので new したやつを Record にキャストしないと変数に入れられないので更なる混乱が待っているという…😞
JS では変数に何入れても良い事になってるので雑に入れて instanceof で目的の型か判別するだけっていう🙄
逆に言うと機能を使う時に呼び元は「これ、目的のオブジェクトなんかな?」を常に調べないといけないからそこがどうも重くなる要因っぽい🤔
とりあえずコンストラクタだけでもやっといた🤤
しかし、 ResultSet の変数どうしようねこれ🤔
どうせ SQL 実行する度に参照が更新されるから何か適当に初期化しといたらいいかな?😑
次回は
コンストラクタ以外のとこの移植進めるぽ🤤