Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

モデルでインスタンスとして多用される配列を、配列としてもアクセスできる構造体的なRowクラスへの変更 #84

Open
uzulla opened this issue Aug 17, 2020 · 3 comments
Assignees

Comments

@uzulla
Copy link
Collaborator

uzulla commented Aug 17, 2020

現状基本的にBlogsModelなどから取得する「インスタンス」はfetchした行なので、記述されているデータが自明でないことが多く、見通しがよく有りません。

例として、以下は「ランダムに1件ブログを取得する」メソッドですが、この返り値はblogsテーブルの1行配列ですが、コードからどのようなカラムがあるのかは類推できません。

/**
* ランダムに1件ブログを取得する
*/
public function findByRandom()
{
$options = array(
'order' => 'RAND()',
);
return $this->find('row', $options);
}

一般的に、カラムに対応するプロパティをクラスとして書き換えることで見通しがよくなります。

ただ、既存コードが配列に強く依存しているため、全体の書き換えはかなりの工数がかかります。

提案

ArrayInterface、およびIteratableを実装した配列としてアクセス可能なクラスを実装し、各種返り値を可能なタイミングでそれに差し替え、順次型をつけて見通しがよくするステップをふむことで、コードを長期間フリーズせずに順次移行ができるかなと考えております。

移行中はArrayとRowクラス混在してしまうのは難点ですが、とりあえずその場合でもArrayとしてあつかって書いておいてもらえれば動くには動くのと、現状のテーブル数は13なので作るだけ作るのは可能と考えております。

とりあえずビジネスロジックはかえず、要所にアノテーションを追記する形で静的解析をきかせてバグを減らし、開発の省力化ができます。

なお、典型的にはModelという命名が多いですが、これはすでにつかわれているので、Model\Row\BlogRowなどの命名になる想定です。

改修後は

現状、暗黙になっている以下のようなコードが

/**
* テンプレートの切り替え
*/
public function switchTemplate($blog_template, $blog_id)
{
$device_type = $blog_template['device_type'];
// 使用テンプレートを更新
$data = array();
$data[Config::get('BLOG_TEMPLATE_COLUMN.' . $device_type)] = $blog_template['id'];

  public function switchTemplate(BlogRow $blog_template, string $blog_id)
  {
    $device_type = $blog_template->device_type; // device_typeはBlogRow内でintと型定義

などと型付けができるようになることを想定しています。

一部はそのまま配列にする予定です

たとえば、以下のようなものは当座そのまま配列にしておく予定です。(データ量が大きくなるかもしれないですし、しぼりこんでいるものを広げると、なにか悪影響があるかもしれませんので)

/**
* ブログの一覧(SelectBox用)
*/
public function getSelectList($user_id)
{
return $this->find('list', array(
'fields' => array('id', 'name'),
'where' => 'user_id=?',
'params' => array($user_id),
'order' => 'created_at DESC',
));
}

@fc2dev
Copy link
Contributor

fc2dev commented Aug 18, 2020

@uzulla
可能な箇所から、明確な型付けを強制する様にお願いします。

@uzulla
Copy link
Collaborator Author

uzulla commented Aug 18, 2020

@fc2dev
ご検討ありがとうございます、では折を見て実行したいと思います。

@uzulla uzulla changed the title 提案:モデルでインスタンスとして多用される配列を、配列としてもアクセスできる構造体的なRowクラスへの変更 モデルでインスタンスとして多用される配列を、配列としてもアクセスできる構造体的なRowクラスへの変更 Aug 18, 2020
uzulla added a commit to uzulla/fc2blog that referenced this issue May 19, 2021
@uzulla
Copy link
Collaborator Author

uzulla commented May 23, 2021

User、PasswordResetToken、EmailLoginTokenにて実装をしてみた。
問題がなければこのような形で置換していく。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants