見出し画像

【Console Application】ファイルとデータベース 185【学習記】

ファイルとかデータベースの話🤤

Q.
コード書かれても追うの面倒なんだけど?
A.
JS はオブジェクトのエイリアスを作るのが簡単で好きな変数へ括弧無しで入れるだけで入れた変数から new できる、というのが言いたいだけ🤤

→参考コード書いてたら思ったよりノってしまって時間がなくなるなど🙄

#学習記 #Kotlin

【Console Application】ファイルとデータベース【学習記】
仕様
https://note.com/sayka/n/nb8a67fa90a64?magazine_key=m7bb64c6a359f#br1mB

仕様
レコード
・レベル
 1-12
・難易度
 b,n,h,a,l
・曲名
・ランプ
 -,x,a,e,c,h,e,f

オプションスイッチ
-u file.csv # 更新(略値)
 ファイル名だけ指定した場合更新処理と見做す
-d file.csv # 削除
-p # csv 出力(略値)
 何も指定せずに起動した場合出力処理と見做す
-v # バージョン
-h # ヘルプ

----備忘録
AnalyzeArgs で引数の並びが判別不能になる機能不足を解消
loadCsv の解析部分は独立
Record.validRange の例外
Record.validType が TXT としか比較してない
Record.setValue の一時 RecordElement 変数を無くせる?
Record.toStringValues は何故か1行になってない


DBControllerBase

いよいよ重要な DB 操作クラスの移植よー🤤

Csv は基本テキストを読み書きするだけじゃなく、一応 Csv の書式に整形するという機能を持たせるのでそこがちょっと複雑だったのよね🤔
最初に作った以前のJava学習時はログ記録用だったので整形と書き出ししか無かったわけだけど今回は「バッチ処理の情報源」として読込みと解析parseが必要になりそこが複雑さの象徴だったかな🤤

Record は単純に DB での1項目の情報をクラス化しただけなので Csv よりも平和な移植だったかな🤔

で、この DB も Csv みたく整形するのにちょっと文になるから手順が増えるってだけで難易度的には Csv と余り違いが無いのよね、本来は🤔
DB で一番むずかしいのは Record を継承して定義される「アプリ用レコード定義クラス」を「 DB クラス内でその名前を参照せずにインスタンス生成を可能にする」方法😑
単純に呼び元で生成して渡せば処理は簡単なんだけど使う側として「そんなの DB クラス側でやってよ」ってなるよね🙄
Record 継承してるから Record へキャストしておけば基本機能だけで取り回しができるので DB 側で継承先のクラス名を参照しないで Record として扱えればどのアプリ開発でも使用できる「ライブラリ」になるよねって話🤤
継承先の名前を DB 側で書いたら、使う時毎回書き換えが発生するのでアウト無能確定😞
DBADBAccesor でやってるけれど今回移植にあたって Java の version 違いによる API の統廃合の影響で書き換えをして、もうちょっとだけ頑張るとクラス名を文字列で入れないでインスタンスを1つ渡すだけで書き換えられるところまでは来てるけどそこまでやってなくて Kotlin でもその状態のライブラリを移植する事になるのよね🤔
Kotlin 学習者の求める処理方法ではないなと思うけどこういう発送が生まれるのも他の言語を触っているからかなと思う🤤
これ、 JSJavaScript だと単にクラスオブジェクト渡して 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 実行する度に参照が更新されるから何か適当に初期化しといたらいいかな?😑


次回は

コンストラクタ以外のとこの移植進めるぽ🤤

この記事が気に入ったらサポートをしてみませんか?