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

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

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

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

Q&A

解決済

3回答

821閲覧

クラスから送られてきた値によって、異なるクラスを返したいのですが…

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2020/03/03 12:12

前提・実現したいこと

システム設計の勉強の為、タクシーを題材にプログラミングしています。

利用者(User)タクシーを呼ぶ→タクシー組織(Organization)最適なタクシーを派遣→タクシー(taxi)利用者を運び、料金請求→利用者支払い

Userクラス:目的地とタクシーの好み(初期値は早い順)
Organizationクラス:Userクラスから送られてきた値によって、最適なTaxクラスを返します。
Taxiクラス:速い、安いなど様々に分岐しています。

Organizationクラスが引数を元に条件分岐で〇〇Taxiクラスを返します。つまりこれはTaxiの種類が増えるごとにどんどん肥大化してしまう。という事になります。
この問題を解決するにはどうしたらいいのでしょうか?

該当のソースコード

PHP

1<?php 2namespace Lib; 3 4class Organization 5{ 6 // システムの成長に従い、どんどん肥大化してしまう 7 public function dispatchTaxi($criteria = 'first') 8 { 9 if ($criteria === 'first') { 10 return new Taxi\FirstTaxi(); 11 } 12 } 13 14}

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

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

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

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

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

takasima20

2020/03/03 12:27

それが本当に必要なら、そうするしかないのでは? 特徴を保持するインスタンスを用意するでもいけそうな気もしますが、仕様が分からないことにはなんとも…
退会済みユーザー

退会済みユーザー

2020/03/04 01:26

そもそも条件分岐させる為に引数を受け取っているのが失敗だった感がありますね。 皆さんありがとうございます。
guest

回答3

0

ベストアンサー

想定がよくわかりませんが、クラスの管理でやるよりRDBなどで
データ管理するような案件だと思います

投稿2020/03/03 12:18

yambejp

総合スコア115010

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

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

退会済みユーザー

退会済みユーザー

2020/03/03 12:27

確かにそうかもしれません。ですが出来ればクラスで管理したいです。 タクシーではなく別の何かにするべきですかね? 引数によって様々な処理をする必要がある時、どうしたら肥大化しないのか。そのような内容で質問するべきだったかもしれません。
yambejp

2020/03/03 12:53

どうしてもクラスでなんとかしたいなら、 それぞれのクラスを例示すべきです。 いまのサンプルですと概要程度しか理解できません
guest

0

そのクラスの肥大化防ぐだけなら

namespace Lib; class Organization { public function dispatchTaxi($criteria = 'first') { $criteriaClass = 'Taxi\' . ucfirst($criteria) . 'Taxi'; if class_exists($criteriaClass)) { new $criteriaClass(); } else { return new Taxi\FirstTaxi(); } } }

こんなかんじやろな。

投稿2020/03/03 13:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ざっくりこんな感じじゃない?

php

1class User 2{ 3 public function callTaxi(Organization $organization) 4 { 5 $taxi = $organization->searchTaxi(); 6 return $taxi; 7 } 8}

php

1class Organization 2{ 3 4 private $taxies; 5 6 public function __construct() 7 { 8 // 自社のタクシーを定義 9 $this->taxies = [ 10 new Taxi(), 11 new Taxi(), 12 new Taxi(), 13 new Taxi() 14 ]; 15 } 16 17 public function searchTaxi() 18 { 19 // 自社のタクシーから一台を選択する 20 $taxi = func($this->taxies); 21 return $taxi; 22 } 23}

投稿2020/03/03 12:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/03/04 03:36

ノーリアクションなのは理解できなかったパターン?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問