質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

0回答

482閲覧

関数のクラス化において、何が適切か分かりません

nikuatsu

総合スコア177

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2022/05/30 13:09

編集2022/05/31 04:44

前提

「おすすめの本にタグをつけて投稿する掲示板」を作成しています。

現状は400個ほどの関数のみで構成されているのですが、クラス化に挑戦することにしました。

どの関数をクラス化するのが適切かが分からないので、ひとまず「投稿コンテンツ(本やタグ)にまつわる処理」をクラス化していこうと考えました。

発生している問題

しかし、本テーブルへのINSERTの過程で、タグテーブルとリレーションテーブルもINSERTするのですが、

クラス化にあたって リレーションテーブルへの保存処理を class Book の中に書くか class Tag の中に書くか、分からず躓いております。

(リレーションテーブルへの保存処理は、関数 insert_my_relations が担っています。)

知りたいこと

どちらが良いのか、または別の書き方が良いのかを知りたいです。アドバイス頂戴できましたら幸いです。

ご回答を頂戴する身として大変僭越ではございますが、「その関数群(該当のソースコード)なら、このようにクラス化したらいいだろう」といった内容でご教示頂くと大変ありがたく思います。

該当のソースコード

現状の関数はこのようになっています。(エラー処理とセキュリティ面は無視してください。)

php

1// パスワードを確認 2function check_thread_password( $thread_id, $password ){ 3 return ['status'=>'ok']; 4} 5 6// 本テーブルを INSERT 7function insert_my_books( $book_data ){ 8 return ['status'=>'ok','book_id'=>1]; 9} 10 11// タグテーブルを INSERT 12function insert_my_tags( $tag_data ){ 13 return ['status'=>'ok','tag_ids'=>[1,2]]; 14} 15 16// リレーションテーブルを INSERT 17function insert_my_relations( $book_id, $tag_ids ){ 18 return ['status'=>'ok']; 19} 20 21// おすすめの本を投稿 22function ajax_post_recommend_book(){ 23 // post された値 24 $password = $_POST['password']; 25 $book_data = $_POST['book_data']; 26 $thread_id = $_POST['thread_id']; 27 28 // パスワードを確認 29 $checked = check_thread_password( $thread_id, $password ); 30 if ( $checked['status'] === 'ok' ) { 31 // テーブルロックして INSERT 32 $inserted = insert_my_books_with_table_lock( $book_data ); 33 if ( $inserted['status'] === 'ok' ) { 34 $book_id = $inserted['book_id']; 35 } 36 } 37 38 echo ['status'=>'ok','book_id'=>$book_id]; 39} 40 41// テーブルロックして INSERT 42function insert_my_books_with_table_lock( $book_data ){ 43 44 $pdo = new PDO(); 45 $pdo->query("LOCK TABLES my_books WRITE, my_tags WRITE, my_relations WRITE"); 46 47 // book テーブルを INSERT 48 $inserted = insert_my_books( $book_data ); 49 if ( $inserted['status'] === 'ok' ) { 50 $book_id = $inserted['book_id']; 51 52 // tag テーブルを INSERT 53 $inserted = insert_my_tags( $book_data['tag_data'] ); 54 if ( $inserted['status'] === 'ok' ) { 55 $tag_ids = $inserted['tag_ids']; 56 57 // リレーションテーブルを INSERT 58 insert_my_relations( $book_id, $tag_ids ); 59 } 60 61 } 62 63 $pdo->query("COMMIT"); 64 return ['status'=>'ok','book_id'=>$book_id]; 65} 66

試したこと

上記の関数群について、class Bookclass Tag に分けて次のようにクラス化してみました。

ここで上述の問題が生じまして、つまり、関数 insert_my_relations を下記は class Book に入れていますが、これを class Tag に入れた方がいいのかで悩んでいる次第です。

もしくは何か全く別の書き方で適切なクラス化の方向性があるでしょうか…

php

1// パスワードを確認 2function check_thread_password( $thread_id, $password ){ 3 return ['status'=>'ok']; 4} 5 6// タグにまつわる処理 7class Tag{ 8 9 // タグテーブルを INSERT 10 public function insert_my_tags( $tag_data ){ 11 return ['status'=>'ok','tag_ids'=>[1,2]]; 12 } 13 14} 15 16// 本にまつわる処理 17class Book{ 18 19 // 本テーブルを INSERT 20 public function insert_my_books( $book_data ){ 21 return ['status'=>'ok','book_id'=>1]; 22 } 23 24 // リレーションテーブルを INSERT 25 public function insert_my_relations( $book_id, $tag_ids ){ 26 return ['status'=>'ok']; 27 } 28 29 // テーブルロックして INSERT 30 public function insert_my_books_with_table_lock( $book_data ){ 31 32 $pdo = new PDO(); 33 $pdo->query("LOCK TABLES my_books WRITE, my_tags WRITE, my_relations WRITE"); 34 35 // book テーブルを INSERT 36 $inserted = $this->insert_my_books( $book_data ); 37 if ( $inserted['status'] === 'ok' ) { 38 $book_id = $inserted['book_id']; 39 40 // tag テーブルを INSERT 41 $tag = new Tag(); 42 $inserted = $tag->insert_my_tags( $book_data['tag_data'] ); 43 if ( $inserted['status'] === 'ok' ) { 44 $tag_ids = $inserted['tag_ids']; 45 46 // リレーションテーブルを INSERT 47 $this->insert_my_relations( $book_id, $tag_ids ); 48 } 49 50 } 51 52 $pdo->query("COMMIT"); 53 return ['status'=>'ok','book_id'=>$book_id]; 54 } 55 56} 57 58// おすすめの本を投稿 59function ajax_post_recommend_book(){ 60 // post された値 61 $password = $_POST['password']; 62 $book_data = $_POST['book_data']; 63 $thread_id = $_POST['thread_id']; 64 65 // パスワードを確認 66 $checked = check_thread_password( $thread_id, $password ); 67 if ( $checked['status'] === 'ok' ) { 68 // テーブルロックして INSERT 69 $book = new Book(); 70 $inserted = $book->insert_my_books_with_table_lock( $book_data ); 71 if ( $inserted['status'] === 'ok' ) { 72 $book_id = $inserted['book_id']; 73 } 74 } 75 76 echo ['status'=>'ok','book_id'=>$book_id]; 77}

補足情報(FW/ツールのバージョンなど)

PHPは7.2ですが、8.0にアプデ可能です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2022/05/31 02:40

タグにまつわる/本にまつわる・・・どういうくくりで何をしたいのか伝わってきません なぜクラスを分けているか要件定義すればどちらがベターか見えてくるかもしれませんが どちらかをベースにもう片方をextendするという考え方もあります
nikuatsu

2022/05/31 04:32

「どういうくくりで何をしたいのか」が決められないからですね。すみません。 今はひとまず「投稿コンテンツ(本とタグ)にまつわる処理をクラス化してみよう」と進めています。取り組んでいくうちに「どういうくくりで何をしたいのか」を決める能力が身についていくだろうという考えです。 ご回答を頂戴する身としましては「その関数群なら、試したことにある方向性よりも、このようにクラス化したらいいだろう」といった内容でご教示頂くと大変ありがたく思います。
yambejp

2022/05/31 05:17

「分ける必要や利便性がないなら分けない」で回答になっていますか?
nikuatsu

2022/05/31 05:55

「必要性や利便性がない選択を行わない」という常識的な内容なので異論はございませんが、質問への回答としてそのような常識をご提示いただくことにつきましては、質問者の立場からするとやや思うところはございます。
yambejp

2022/05/31 06:02

回答者の立場からすると相当思うところがあってああいう補足(回答)になっているんですけどね。
nikuatsu

2022/05/31 06:13

ここまでのやりとりで「相当思うところ」が生じるような何かがあったのですね…。なんだか申し訳ございません。
nikuatsu

2022/05/31 11:00 編集

「相当思うところ」が何か考えてみたのですが、もしかして前回のご質問( https://teratail.com/questions/p48zgc0ac22qmg )で低評価が付けられてしまったことでしょうか? それでしたら私は低評価をしていないので、どうかご容赦頂ければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問