見出し画像

かにのオブジェクト思考、はじめの一歩

かにがGASを書く時、とても感覚的にしか書いてない。

「こうしたらよさそう」
「なんとなくこっちがいい」
「こういう匂いがする」
・・・

これにちゃんと向き合って、言語化する必要がある。

ひとりで書くなら感覚的でいい。
完成したものを見て、後から理由づけすることもできる。
でも、ゼロからの思考過程をまったく言語化できない。

「やってみて、しっくりきたほうを選ぶ」これが今のかに。

この反省を忘れないうちにちゃんと向き合って、言語化しなければ。

追記
最初の一歩を踏み出したのに「オブジェクト指向」が誤字ってる。
オブジェクト指向を思考しているので良しとしよう(V)o¥o(V)

1)はじめの一歩は「モノ」の整理

まず、「モノ」に対応するファイル(=クラス)とメイン関数を作る。

このタイミングではじめにできるのが以下のクラス。

・Serviceクラス:API
・Repositoryクラス:データ

たとえばkintoneの「顧客管理」アプリでレコードが作成されたらGoogleドライブにフォルダができ、kintoneレコードにフォルダURLを書き込む機能があるとする。

【Serviceクラス】
KintoneService.gs:kintoneのAPI通信をするクラス
DriveService.gs:DriveAppを呼び出すクラス

【Repositoryクラス】
AppCustomerRepository.gs:「顧客管理」アプリのデータクラス

2)メイン関数のフローを仕上げる

メイン関数には、フローだけを先に書く。

コメントだけでいい。日本語でいい。どのクラスから何のメソッドを呼び出すかまで書く。

/**
* trigger:kintoneの「顧客管理」アプリでレコードが新規作成される
* summary:ドライブにフォルダ作成し、フォルダURLをレコードに登録する機能
* @param {Object} e kintone Webhookのイベント変数
*/
function main(e) {

 //顧客管理アプリ(AppCustomerRepository)クラスから必要なデータを取得
 
 //ドライブクラス(DriveService)クラスでフォルダ作成
 
 //顧客管理アプリ(AppCustomerRepository)クラスからレコードにURLを登録
 
}

ここははじめから正解になれないことも多い。実装しながら変わることがある。(たぶんだめなやつ)

3)クラスの内部構成を考えつつドメイン抽出

【KintoneService.gs】:kintoneのAPI通信をするサービスクラス
・constructor
  - サブドメイン
  - アプリ情報(id, name, token)
  - ベースURL
・update:レコードを更新するメソッド
・_putOption:PUTリクエスト時のオプションプロパティ

【DriveService.gs】:DriveAppを呼び出すサービスクラス
・constructor
  - カレントフォルダID
  - カレントフォルダオブジェクト
・createFolder:フォルダを作成するメソッド
【Folder.dmain.gs】:フォルダ名を決定するドメインクラス
・constructor
  - 顧客アプリのフィールドの値たち
  - 現在の年度
・folderName:フォルダ名を文字列生成するプロパティ
【AppCustomerRepository.gs】:「顧客管理」アプリのリポジトリクラス
・constructor
  - アプリ情報(id, name, token)
  - 顧客番号
  - レコード
  - フィールドの値たち
・getRecord:イベントまたはkintoneからレコードを取得するメソッド
・getFieldValues:フィールドの値を連想配列で取得メソッド
・updateFolderUrl:フォルダURLフィールドを更新するメソッド

4)メイン関数を仕上げる

/**
* trigger:kintoneの「顧客管理」アプリでレコードが新規作成される
* summary:ドライブにフォルダ作成し、フォルダURLをレコードに書き込む機能
* @param {Object} e kintoneWebhookのイベント変数
*/
function main(e) {

 //顧客管理アプリ(AppCustomerRepository)クラスから必要なデータを取得
 const customerApp = new AppCustomerRepository(e);
 const customerFields = customerApp.fields;
 
 //ドライブクラス(DriveService)クラスでフォルダ作成
 const driveUrl = new DriveService(customerFields).createFolder();
 
 //顧客管理アプリ(AppCustomerRepository)クラスからレコードにURLを登録
 customerApp.updateFolderUrl(driveUrl);
 
}

※今ざっくり考えただけなので動作は保証できません

5)クラスのメソッドを作成する

あとは細かいこと書くだけ。

現状の課題点

・手順1の3層(コントローラークラス・サービスクラス・リポジトリクラス)への振り分けが一般的な感覚でない、かにの独自ルールになっている気がする
・手順3のクラスの内部構成をどうやって考えているのかが言語化できていない
・手順3で抽出する「ドメイン」の理解が一般的な感覚でない、かにの独自ルールになっている気がする

Next:

課題点へのアンサーを言語化しながら、モブプロの課題を再考してみる。
オブジェクト思考習得に向けて、ちょっと一歩だけ踏み出したかに。

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