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

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

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

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

Q&A

解決済

2回答

738閲覧

共通するメソッドがあるクラスのリファクタリング方法

bws

総合スコア98

PHP

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

0グッド

0クリップ

投稿2018/12/14 10:46

編集2018/12/15 02:12

困っていること

二つの似ているクラスがある場合どのようにリファクタリングしたらいいでしょうか?
Baseを継承しているため、新たに継承させることができません。
またBaseに共通しているメソッドを書いてしまうと、この二つ以外のBaseを継承しているクラスにも反映されてしまします。
ヒント、アドバイスなど頂けませんでしょうか。よろしくお願いします。

PHP

1class Area extends Base 2{ 3 4 protected static $data = array( 5 '0' => '東', 6 '1' => '西' 7 ); 8 9 public static function getData() 10 { 11 return self::$data; 12 } 13 14 public static function getName($code) 15 { 16 $data = self::getData(); 17 return $data[$code]; 18 } 19}

PHP

1<?php 2class Pref extends Base 3{ 4 protected $data = array( 5 '1' => '北海道', 6 '2' => '青森県', 7 '3' => '岩手県', 8  // 省略 9 ); 10 11 public static function getData() 12 { 13 return self::$data; 14 } 15 16 public static function getName($code) { 17 $data = self::getData(); 18 return $data[$code]; 19 } 20} 21

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

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

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

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

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

guest

回答2

0

たぶん元々の設計が悪すぎてどうにもならないのでは…。
Baseに書いたら困る時点で何か間違えてる。

Baseに影響与えず共通化する一番簡単な方法はtrait

投稿2018/12/14 11:13

kawax

総合スコア10377

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

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

bws

2018/12/15 02:29

現時点ではBaseに書いても問題ないのですが、このままBaseにどんどん書いていいんだろうかという疑問がありましたが良いのかとスッキリしました。 どうにもならない時はtraitを検討してみたいと思います。ありがとうございました!
guest

0

ベストアンサー

$prefs は $data の誤りですかね?

一番確実かつ分かりやすいのは、Base の下に1つ共通クラスを挟むことでしょうか。
Base -> Base2 -> Area, Pref
という感じですね。
getName(), getData() は Base2 に記載してそれぞれ末端のクラスからは削除となります。

ただ、上記の内容であれば、Base クラスに同名のメソッドがないのであれば、Base クラスに書いてしまっても問題なさそうな気はしますね。
他の Base の子クラスにも当然影響がありますが、もともと定義されていないのであれば呼び出されることはないでしょうし。

投稿2018/12/14 10:55

ssasaki

総合スコア1167

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

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

bws

2018/12/15 02:21

$dataの誤りでした、修正させていただきました。 ありがとうございます。クラスは複数継承出来ないと思っていたのですが、一つずつ継承すれば良いんですね。 現時点ではBaseに書いても問題ないのですが、関係ない処理をこのままBaseにどんどん書いてしまって大丈夫なんだろうかという不安がありましたがスッキリしました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問