前提・実現したいこと
PHPにて、オブジェクト指向プログラミングを目指しています。
しかし、初めに、手続き型でプログラミングを学んだことから、なかなかオブジェクト指向での実装ができません。
そこで、次のプログラムを例にオブジェクト指向を実現するには、あるいは、みなさんだったらどう実装するかをご教授願えると助かります。
要求仕様
同じ長さの二つの文字列 A, Bが存在する。
A, Bを比較して、以下の条件で値を返す。
2つの文字列のスペルがまったく同じであれば、2を返す。
二つの文字列のスペルが1つだけ異なる場合、1を返す。
その他は、0を返す。
例)
A:"teratail"
B:"teratair"
この場合、1を返す。
該当のソースコード
<?php
class Hoge{
private $count = 0;
private $output = 0;
public function compare($a, $b){
$this->count = 0;
for($i = 0; $i < strlen($a); $i++) {
if($this->isSame($a[$i], $b[$i]) == 1){
$this->count +=1;
}
}
if($this->count == 0){
$this->output +=2;
}
if($this->count == 1 ){
$this->output +=1;
}
return $this->output;
}
public function isSame($a, $b){
if ($a !== $b) {
return 1;
}
else{
return 0;
}
}
}
$hoge = new Hoge;
echo ($hoge->compare("hoge", "hogu")); //1を返す
?>
補足情報
個人的に気にかかっている点として、カウンタを使用していることです。
カウンタを使うのは手続き型のイメージがあります。
もし、カウンタを用いることが望ましくない場合、用いない場合の実装などを教えていただければ幸いです。
参考情報
オブジェクト指向の参考記事
https://ameblo.jp/principia-ca/entry-11876117369.html
問題の元ネタ(paizaは提出コードを公開できないので、内容を改変しています。)
https://paiza.jp/student/challenges/116/page/problem
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
オブジェクト指向で捉えるべき箇所が見つかりませんでした^^;
<?php
class Hoge{
public function compare($a, $b){
$a_arr = str_split($a);
$b_arr = str_split($b);
$count = count(array_diff_assoc($a_arr, $b_arr));
return $count>=2?0:!$count+1;
}
}
$test_arr = ['hoge', 'hoga', 'hoeg'];
$hoge = new Hoge;
foreach($test_arr as $val){
echo ($hoge->compare("hoge", $val)).PHP_EOL;
}
オブジェクト指向で考えるなら、文字列 a,文字列 b をオブジェクト化してゴニョゴニョやるんじゃないかなぁ。。。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
オブジェクト使うんなら、多分こんな方向性
<?php
class ArrayOfString{
public $str_org;
public $str_arr;
function __construct($str){
$this->str_org = $str;
$this->str_arr = str_split($str);
}
}
$test_arr = ['hoge', 'hoga', 'hoeg', 'hgeo'];
$hoge = new ArrayOfString('hoge');
foreach($test_arr as $val){
$str = new ArrayOfString($val);
echo $hoge->str_org.'と'.$str->str_org.'の比較:';
$count = count(array_diff_assoc($hoge->str_arr, $str->str_arr));
echo $count>=2?0:!$count+1;
echo PHP_EOL;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
質問に対する直接的な回答ではありません。あくまで参考記事紹介です。
記事としては下記とか、
実践もあるなら下記とか
参考にされた方が良いかも。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
2つの文字列のスペルがまったく同じであれば、2を返す。
二つの文字列のスペルが1つだけ異なる場合、1を返す。
その他は、0を返す。
3行それぞれを評価するのに、最も重い処理は2を返す条件じゃないかな、
次に重いのは1を返す条件で、
簡単に判別できて大多数の結果がそうなるであろう条件は0。
って考えると、
0を返す条件をもう少し深掘りする。
・互いの文字列長が異なる
って判定を最初に持ってくれば、さっさと0を返して終われる判定。
$this->outputをわざわざ使う理由がよくわからないけど、
メソッド内ローカル変数を使ってもいいんだよ。
一文字でも違っていれば1を返すのだから、
文字列のアタマから照合して
public function compare($a, $b){
if (strlen($a) !== strlen($b)) {
return 0;
}
$count = 0;
for($i = 0; $i < strlen($a); $i++) {
if($this->isSame($a[$i], $b[$i]) == 1){
$count +=1;
}
}
if($this->count == 0){
return 2;
}
else {
return 1;
}
}
ってのはダメでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
そもそもPHPだけではオブジェクト指向分からないし難しいこと気にする前に
良いコード書けるようになるのが先。
試してないけど今回のならarray_diff_assoc()
辺り使えば簡単に比較できるかも。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
mts10806
2018/05/03 19:35
オブジェクト指向については何か参考にした文献や記事などはありますか?
plato
2018/05/03 19:37
主にこちらです。https://ameblo.jp/principia-ca/entry-11876117369.html
mts10806
2018/05/03 19:37
正直この要件だけだとオブジェクト指向にしたとしてもほぼ恩恵を得られません。
mts10806
2018/05/03 19:37
参考記事などは回答に必要な材料となるので質問本文に追記してください。
plato
2018/05/03 19:42
失礼しました。追加しました
退会済みユーザー
2018/05/03 19:42
なんでこういう、実務ではおおよそありえなそうな例題を出すかな。
m6u
2018/05/03 19:44
$this->outputを初期化する概念がないのがニントモカントモ
mts10806
2018/05/03 19:46 編集
オーソドックスな例で車とか「役割をしっかりわけられる」ようなものとか、掲示板とかDB絡めた方がしっかり使えそうですね。せめてプロパティ共有するとかくらいはしたいですが、この要件だとそもそもローカル変数のみで済むので・・・。
退会済みユーザー
2018/05/03 19:50
paizaみれないけど、あそこの問題って実務ではおおよそ関係ない問題ばっかなのであんま、相手にしてない。
退会済みユーザー
2018/05/03 19:57
オブジェクト指向といったら、キャットドア課題でしょ。
m6u
2018/05/03 20:08
2文字以上食い違っていたらどうしたらいいんだろう、teratailとraratailとか
asahina1979
2018/05/03 20:08
就活のチャレンジは公開されてない(会員登録必須)なので答えかねるほうにいきそうだな
plato
2018/05/03 20:13
paiza見れないですよね。失礼いたしました...問題と内容を変えてはいるのですが、それでも不適切な場合は質問自体を消します。
退会済みユーザー
2018/05/03 20:17
質問が不適切なわけじゃないけど、もっと現実味あるお題じゃないと座布団取りに行く食尻が湧かないっす。
mts10806
2018/05/03 20:18
でしたら私の回答はベストアンサーとしては不適切なので、もう少し回答を待ってみては?
退会済みユーザー
2018/05/03 20:24
だから、やっぱりキャットドア課題をやるのが一番なんですよ。