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

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

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

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

オブジェクト指向

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

Q&A

解決済

5回答

2946閲覧

処理の関数切り分けについて

newyee

総合スコア213

PHP

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

オブジェクト指向

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

1グッド

0クリップ

投稿2019/04/01 07:35

PHPの学習の為、掲示板のサイトを作成致しました。
掲示板は、投稿されたコメント一覧及び、書き込みフォームを表示する「bbs_1.php」書き込みフォームより投稿されたコメントを処理する「write1.php」コメント一覧部分の削除フォームから、削除パスワードを入力された場合にコメントを削除する、「delete1.php」の3つのファイルで構成しております。ですが、学習の為、関数切り分けを行いたいと思い、データベース接続部分のPDOインスタンスを作成する部分「Db_connect.php」、及び、データベースの接続情報を定数として、定義した、「config.php」作成し、処理を切り分けてみました。

php

1<?php 2 3require_once 'Db_connect.php'; 4require_once 'config.php'; 5 6 error_reporting(E_ALL); 7 ini_set("display_errors",1); 8 9 //1ページに表示されるコメントの数 10 $num = 10; 11 //ページ数が指定されている時 12 $page = 0; 13 if(isset($_GET['page']) && $_GET['page'] > 0){ 14 $page = intval($_GET['page']) -1; 15 } 16 17 try{ 18 19 $dbh = db_connect(DSN,DB_USERNAME,DB_PASSWORD); 20 $stmt = $dbh->prepare("SELECT id,name,title,comment,created_at,password FROM post ORDER BY created_at DESC LIMIT 21 :page,:num"); 22 //パラメーターを割り当て 23 $page = $page * $num; 24 25 $stmt->bindValue(':page',$page,PDO::PARAM_INT); 26 $stmt->bindValue(':num',$num,PDO::PARAM_INT); 27 $stmt->execute(); 28 }catch(PDOException $e){ 29 echo "エラー: " . $e->getMessage(); 30 } 31 32?> 33 34 <html> 35 <head> 36 <title>交流サイト:掲示板</title> 37 <meta charset="utf-8"> 38 </head> 39 <body> 40 <h1>掲示板</h1> 41 <form action="write1.php" method="post"> 42 <p>名前:<input type="text" name="name" value="<?php echo isset($_COOKIE['name']) ? $_COOKIE['name'] : '' ?>"></p> 43 <p>タイトル:<input type="text" name="title" size="60"></p> 44 <textarea name="comment"></textarea> 45 <p>削除パスワード(数字4桁):<input type="text" name="pass"> 46 <input type="submit" name="submit" value="書き込む"> 47 <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>"> 48 </form> 49 <hr> 50 <?php 51 while($row = $stmt->fetch()): 52 53 $title = $row['title'] ? $row['title'] : '(無題)'; 54 ?> 55 <p>名前:<?php echo $row['name'] ?></p> 56 <p>タイトル:<?php echo $title ?></p> 57 <p><?php echo nl2br(htmlspecialchars($row['comment'],ENT_QUOTES,'UTF-8'),false) ?></p> 58 <p><?php echo $row['created_at'] ?></p> 59 <form action="delete1.php" method="post"> 60 <input type="hidden" name="id" value="<?php echo $row['id']; ?>"> 61 削除パスワード:<input type="password" name="pass"> 62 <input type="submit" value="削除"> 63 <input type="hidden" name="token" value="<?php echo password_hash(session_id(),PASSWORD_DEFAULT); ?>"> 64 </form> 65 <?php 66 endwhile; 67 //ページ数の表示 68 try{ 69 $stmt = $dbh->prepare("SELECT COUNT(*) FROM post"); 70 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 71 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 72 73 //クエリの実行 74 $stmt->execute(); 75 76 }catch(PDOException $e){ 77 echo "エラー:" . $e->getMessage(); 78 } 79 /** 80 * コメントの件数を取得 81 *fetchColumn関数で 最初のレコードを取り出し、最初の列「id」のデータを取り出す 82 * idは降順に設定されているため、コメントの件数が分かる 83 * */ 84 $comments = $stmt->fetchColumn(); 85 $max_page = ceil($comments / $num); 86 echo '<p>'; 87 for($i = 1; $i <= $max_page; $i++){ 88 echo '<a href="bbs.php?page=' . $i .'">' . $i . 89 '</a>&nbsp;'; 90 } 91 echo '</p>'; 92 ?> 93 94 </body> 95 </html>

上記は、「bbs_1.php」になります。

php

1<?php 2 3require_once 'Db_connect.php'; 4require_once 'config.php'; 5 6error_reporting(E_ALL); 7ini_set('display_errors', '1'); 8 9$err_message = []; 10 11if(!empty($_POST)){ 12 13 $title = filter_input(INPUT_POST,'title',FILTER_SANITIZE_SPECIAL_CHARS); 14 $token = filter_input(INPUT_POST,'token',FILTER_SANITIZE_SPECIAL_CHARS); 15 16 if(!$name = filter_input(INPUT_POST,'name',FILTER_SANITIZE_SPECIAL_CHARS)){ 17 $err_message[] = '名前が入力されていません'; 18 } 19 20 if(!$pass = filter_input(INPUT_POST,'pass',FILTER_SANITIZE_SPECIAL_CHARS)){ 21 $err_message[] = 'パスワードが入力されていません'; 22 } 23 24 if(!$comment = filter_input(INPUT_POST,'comment',FILTER_SANITIZE_SPECIAL_CHARS)){ 25 $err_message[] = 'コメントが入力されていません'; 26 } 27 28} 29 30 31if(!preg_match("/^[0-9]{4}$/",$pass)){ 32 33 $err_message[] = 'パスワードを4文字で入力してください'; 34 35} 36 37$pass = password_hash($pass,PASSWORD_DEFAULT); 38 39if(count($err_message) === 0){ 40 //CSRF対策 41 if(!password_verify(session_id(),$token)){ 42 header('Location:bbs_1.php'); 43 exit(); 44 } 45 46 setcookie('name',$name,time() + 60 * 60 * 24 * 30); 47 48 49 50 //データベースに接続 51 52 53 try{ 54 55 $dbh = db_connect(DSN,DB_USERNAME,DB_PASSWORD); 56 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 57 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 58 $stmt = $dbh->prepare(" 59 INSERT INTO post (name,title,comment,created_at,password) 60 VALUES (:name, :title, :comment, now(), :pass)"); 61 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 62 $stmt->bindValue(':title',$title,PDO::PARAM_STR); 63 $stmt->bindValue(':comment',$comment,PDO::PARAM_STR); 64 $stmt->bindValue(':pass',$pass,PDO::PARAM_STR); 65 $stmt->execute(); 66 67 }catch(PDOException $e){ 68 die ('エラー:' . $e->getMessage()); 69 } 70 71} 72 73?> 74<html> 75<head> 76 <meta charset="utf-8"> 77 <title>Page Title</title> 78 79</head> 80<body> 81 <?php 82 echo implode("<br />",$err_message); 83 ?> 84 <h4>投稿に成功しました。</h4> 85 <p><a href="bbs.php">戻る</a> 86 87</body> 88</html> 89

上記は「write1.php」になります。

php

1<?php 2 require_once 'config.php'; 3 require_once 'Db_connect.php'; 4 error_reporting(E_ALL); 5 ini_set("display_errors",1); 6 7 //エラーメッセージ 8 $err_msg = []; 9 10 if(!empty($_POST)){ 11 12 if(!$pass = filter_input(INPUT_POST,'pass',FILTER_SANITIZE_SPECIAL_CHARS)){ 13 14 $err_msg[] = 'パスワードが入力されていません。'; 15 16 } 17 18 19 $token = filter_input(INPUT_POST,'token',FILTER_SANITIZE_SPECIAL_CHARS); 20 21 //POSTされたIDを取得 22 $id = filter_input(INPUT_POST,'id',FILTER_SANITIZE_SPECIAL_CHARS); 23 $id = intval($id); 24 25 } 26 27 //CRLF対策 28 if(!password_verify(session_id(),$token)){ 29 header('Location:bbs.php'); 30 exit(); 31 }; 32 33 if(count($err_msg) === 0){ 34 35 36 try{ 37 $dbh = db_connect(DSN,DB_USERNAME,DB_PASSWORD); 38 $stmt = $dbh->prepare(" 39 SELECT password FROM post where id = :id 40 "); 41 42 $stmt->bindValue(':id',$id,PDO::PARAM_INT); 43 44 $stmt->execute(); 45 46 $db_pass = $stmt->fetch(); 47 48 if(!password_verify($pass,$db_pass['password'])){ 49 50 die('パスワードが違います'); 51 } 52 53 $stmt = $dbh->prepare(" 54 DELETE FROM post WHERE id = :id 55 "); 56 57 $stmt->bindValue(':id',$id,PDO::PARAM_INT); 58 $stmt->execute(); 59 60 }catch(PDOException $e){ 61 62 die( "エラー:" . $e->getMessage()); 63 } 64 65 header('Location: bbs_1.php'); 66 exit(); 67 68 } 69 70?>

上記は「delete1.php」になります。

php

1<?php 2define('DSN','mysql:host=localhost;dbname=online_bbs;charset=utf8'); 3define('DB_USERNAME', 'root'); 4define('DB_PASSWORD', '12345');

上記は「config.php」になります。

php

1<?php 2function db_connect($dsn,$user,$password){ 3 $dbh = new PDO($dsn,$user,$password); 4 $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 5 $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 6 return $dbh; 7}

上記は、「Db_connect.php」になります。

「bbs_1.php」「write1.php」「delete1.php」内で、他に関数切り分けした方が良いと思う箇所などがありましたら、ご助言頂きたいです。
よろしくお願いいたします。

toll_tree👍を押しています

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

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

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

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

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

guest

回答5

0

タグ「オブジェクト指向」は今回どのように関係するのでしょうか。
PDOはphpから提供されている機能ですがそれを「オブジェクト指向」と置いているのでしょうか。

正直なところ、この手のものはやろうと思えば幾らでもできてしまうものなので、質問としてあげるには不適当の内容と思います。
「その幾らでもできてしまうところを教えて」と言われると質問ではなくなります。
「こうしなければならないを教えて」となるともはや質問ではなくなります。仕事だと現場のコーディングルールに従うわけですし、現場のルールであればおいそれと公の場に出すわけにはいきません。
趣味としたら好きなようにやったら良いだけです。

要件通り動いていることが大前提。
もしリファクタリングなのであれば前と同じ操作で同じ結果が出ていればOK。

「どこまでもできる、キリがない」ので、どこまでやるかは自分が決めることです。

リファクタリングとしても何を機能切り出しされたのか見えないのは問題ですね。
基本は「同様の処理は関数化(引数で切り分ける)」
「ファットコントローラーになるなら外出し」
「役割分担、一定の仕事をきちんと与えて似た仕事を重複させない」
ですが、その観点で「自分では限界までやった」のでしょうか?

ほとんど1枚ペラのプログラムと変わらないですね。「他にある?」と聞く段階ではなさそうです。
9割程度できていて1割なんとかならないか、なら分かりますが、1割も出来てなさそうに見えます。
ツッコミどころが多すぎてどこから突っ込むべきか、というか、もっと質問する前に考えられることだらけで突っ込む気もおきない、という感じです。
(質問者さんのこれまでの経緯から、この程度で止まってしまってることが残念でならないです。そういった意味で「出来そうなところの1割も」という意味で書いてます。)

いっそ、ほぼ0から作り直してみては。
今あるものをなんとかしようというのではなく、部品作っておいて使う形に。

投稿2019/04/01 07:56

編集2019/04/01 08:08
m.ts10806

総合スコア80850

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

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

m.ts10806

2019/04/01 08:05

今特に問題起きてなかったりなにか具体的にやりたいことがあってやってみたけどどうしても進まない とかでなければ、 「うん、あとはがんばって」としか言えないです。
newyee

2019/04/02 03:23

mtsさんに、まず、関数切り分けもできていないのに、オブジェクト指向が~と言われたことがあった為、関数切り分けに挑戦していこうと思ったんですよね。 正直勉強方法で、迷ってしまっている部分はあります
m.ts10806

2019/04/02 03:31

質問があげられてもっとも早い段階に投稿された回答をベストアンサー選択後まで放置しておいてようやくついたコメントがまさか愚痴とは思ってませんでした。回答内容に触れた様子もないですし理解されたかどうかも分からない。 仕事でやりたいならいつまでも「勉強モード」で出来るわけないですよ。やるべきは勉強方法模索ではなく、問題解決方法の模索、思案。 そして、正論をきちんと受け止めること。
m.ts10806

2019/04/02 03:37

まあ、プログラミングやるのに勉強モードのままでは趣味でも何もできるようにはならないですけどね。 技術系の専門学校や学部卒の子が実際の現場でできるかというとそういうわけでもない(むしろ勉強でしかやってないから使えないとことの方が多い) もちろん技術系の学校卒業してないからできないということではない(現に私は完全文系大卒) 考えることができないとプログラミングはできるようになりません。 別の回答にあるように100人に聞けば100通りの「正解」が出る世界です。検索すれば似て非なる同じ目的を達成できるコードが幾らでも出てくる世界です。 「勉強方法」でどうにかなるものではないです。考えること以外に何もない。エンジニアがもっているものは知的財産ですから。
newyee

2019/04/02 03:37

「愚痴」のつもりで、返信したつもりはありません。 ただ、mtsさんの言う通り実行した為、mtsさんの解答には、疑問がありました。
m.ts10806

2019/04/02 03:39

じゃ、先に疑問解決した方が良いのでは? 私は信念をきちんと以てアドバイスしており一貫性があります。あなたが正しく解釈、実行できてないのはこれまでの展開から明白ですよ。
m.ts10806

2019/04/02 03:46

「関数切り分けに挑戦しました!」 →db_connect()という関数がひとつできただけ そりゃ誰が見ても「どこが?」ってなりますよ。 私の回答にも書いてますし、他の回答にもあります。 ただダラダラと現状のコードとにらめっこしてもどうにかなるはずないじゃないですか。だってあなたがベタ書きしかやってない頃のコードですよ。 前にも言ったかもしれない。 最初から作り直さないと昔の自分からは抜け出せません。昔のコードが基準だから。 経験も技術もあればそれも可能かもしれない。でも経験も技術もある人は昔のコードはスッパリ捨てる。じゃないとまともなコードにならないことが分かってるから。 経験も技術もない人は余計に昔のコードは捨てなきゃいけないのは当然です。 私は勉強方法をアドバイスしているわけではないです。 プログラミングにおいて成長するために必要な概念をアドバイスしています。勉強したいなら学校いってください(オンラインスクールでも何でも)
newyee

2019/04/02 03:53

>>私は勉強方法をアドバイスしているわけではないです でしたら、今まで具体的に段階的に、こうした方が良い、などの指摘はなんだったのでしょうか...? 正直、親身になってくれていると感じていたので、残念です
m.ts10806

2019/04/02 03:57

これで親身になってないと感じるのでしたらあなたはそれまでの人です。 というか、なぜそこだけ切り取るのでしょうか?私は一行しか書いてませんか?前後の流れ無視でそこだけ都合の良いように切り取られても。回答含めて全部ゴミ箱に放り込むようなコメントよくできますね…。 まさかここまでとは思ってなかった。 点だけしか見てないの、お気づきですか? 本来は線でも面でも不足。立体的に物事を見てください。
newyee

2019/04/02 04:02 編集

親身になって貰っていると思っていたので、具体的なアドバイスは何故しないのかが疑問でならないと言っているんです。 それだけ、親身になってくれているなら、terateilの質問としてはどうかと思う、とかではなく、もっとこうした方が良い、などといってくれても良いのではないでしょうか?
newyee

2019/04/02 04:06

>>なぜそこだけ切り取るのでしょうか? 別にここだけ切り取った訳ではなく、一つ前に返信させてもらった点がずっと気にはなっていたので。
m.ts10806

2019/04/02 04:08

書いてるじゃないですか。 回答ちゃんと読んでます?どう捉えたのか全くわからない。 それに何度も書いてるように本質は考えること。考えるための具体的な方針もヒントも書いてるののに「具体的なアドバイスをしてない」とは非常に心外ですね。 方針でなにか分からないことがあれば確認してもらったらそれでいいんですが、ご自身で勝手に思い込んでスルーしてたら解決も何もないです。「あー考えることを放棄してるな」という印象しかないですね。
newyee

2019/04/02 04:19

分かっていますよ。しかし、僕のような初学者にとっては、かなり抽象的な説明に思えてしまいます。 例えば、「いっそ、ほぼ0から作り直してみては。 今あるものをなんとかしようというのではなく、部品作っておいて使う形に。」ここの部分でも、抽象的で、じゃぁ具体的にどうすれば良いかは、書かれていないので、分からないです。 前々から、こういった点が疑問ではありました。
BluOxy

2019/04/02 04:20

>親身になって貰っていると思っていたので、具体的なアドバイスは何故しないのかが疑問でならないと言っているんです。 問題解決の力をあなたにつけてほしいからです。 授業で教わったのは答えではなく答えの求め方でしょう。違いますか。
newyee

2019/04/02 04:21

>>あー考えることを放棄してるな」という印象しかないですね。 どう捉えようが勝手ですが、あまり思い込みだけで、人のことを中傷するのは良くないと思います。
m.ts10806

2019/04/02 04:33 編集

別回答から引用 「PG100人に聞いたら100通りの回答されると思います。つまり正解はありません。 」 正解がないので抽象的なコメントが入るのは当たり前です。 それにそこは具体的な方針ではないですね。 それとも100通りのコードを提示されないと納得できませんか?それであなたは本当に成長できると思いますか? そうは思わないからこの質問の回答には考え方、問題解決の仕方の提示がメインとなっていますね。全ての回答がそう。 今回の質問に具体的に答えるには方針しかない。むしろコードは邪魔です。考え方は無限大、コードを提示することはそれを縛ることになる。 その程度で中傷と思われるのはどうなんでしょうか。 プログラミングをしていく上で最もやってはいけない「考えることを放棄」をしている人に対して何も指摘するなと言う方が無理です。(むしろ赤の他人に指摘してもらえてることが奇跡) また点でしか捉えてませんよ。そういう反応をするから「一部しか切り取られてない」「考えるのを放棄してる」という印象をあたえるわけです。思い込みでもなんでもありません。
m.ts10806

2019/04/02 04:38

他の質問者には興味はありますか? 流れを追っていくとわかります。 コピペコードだけもらって解決としている人は延々と成長できずに同レベルの質問をし続け、コードがない質問や指摘を無視し続けています コードがない質問や指摘をきちんと真っ直ぐ受け止めた質問者はやがて質問しなくなります(中には回答側に回った人もいるでしょうね) この違い、わかりますか? どちらのパターンも私は知っていますがその人本人のこともあるので具体的なユーザー名は出せません。 あなたはどちらになりたいのですか? まあ、考えてみてください。
newyee

2019/04/02 04:39

100人いたら、100通りの答えがあるというのは、他のご回答者様からのご回答にもあったので、分かるのですが、今現在、自分は一通りも実現できていない状態なので、その中の内の一つでも、出来るようになりたいと思っています。ですので、一つでもやり方を教えて貰えれば、関数切り分けの処理のコツが掴めるかもしれませんし、今よりは確実に、前進するのではないかと思いますけどね
newyee

2019/04/02 04:46

>>コピペコードだけもらって解決 コードだけ貰っても現在の自分には、分からないですし、コードの中で、色々疑問点があったら、お聞きしたいとは考えています
m.ts10806

2019/04/02 04:56

ですから、私から出せるのは 回答にある通り。 「同様の処理は関数化(引数で切り分ける)」 「ファットコントローラーになるなら外出し」 「役割分担、一定の仕事をきちんと与えて似た仕事を重複させない」 基本方針、コツ全て入ってます。 それに初心者であると自覚されてるなら「確実に前進すると思う」なんてことは口が裂けてもいわないでください。自身の成長を阻害するだけです。 今回の質問に対するアドバイスは以下で最後です。 理解できないところがあれば確認してくださいね?いきますよ? ----------- 「要件を満たしてればそれでOK」です。 実際に利用する人にとってはURLがどうとか中の作りがどうとか全く関係ないわけです。 それなら「ベタ書き」も「1パターン」です。だってきちんと要件通り動いてるんですよね? プログラミングの本来の目的は問題解決。要件通り動いてるなら問題は解決されているわけです。 あとは作る側のさじ加減。ちょっと悪い言い方すれば「エゴ」です。 他の回答にもあるように「何を目標とするか」しかありません。 例題をだします。これは実際に新人にプログラミングを教える際に出したこともある課題です。 ----- Q.「Hello World」と画面に出力しなさい。ただし、以下のやり方 以外 <?php echo "Hello World"; ※あと、phpタグ外での出力、文字の数分だけechoを書くのもNG 可能な限りたくさん。10通り以上だしましょう。 --------- どれだけ出せるか試してみると良いです。 でも、如何に難しく書けるかに挑戦することで考える力が身に付きます。マニュアルを活用する力が身に付きます。 課題というよりいわばトレーニングです。気づけば何パターンも作れるようになります。 そうすれば単に人にコツをきくよりも何倍も前に、着実に進めますよ。 「わかったつもり」になりませんからね。
m.ts10806

2019/04/02 06:15

BluOxyさん 補足ありがとうございます。 私は求め方は毎回提示してるのですが、コードがないとそう捉えられないのが残念なところです。 答えが幾らでも出せる以上は「求め方」 ===「考え方」なんですけどね。
newyee

2019/04/02 08:09

「ファットコントローラーになるなら外出し」とあるのですが、これはどういう意味なのでしょうか? 例題ですが、ほぼ10通りに近い数出すことができました
m.ts10806

2019/04/02 08:16

「ファットコントローラー」で検索。 >ほぼ10通りに近い数 私の回答に書いてあります。限界までやりましたか? 一応私「10通り以上だしましょう」と書いたわけですが、10に満たないわけですし、そこは「挑戦」してください。 使ったことない機能、使ったことはあるがまだ不安な機能、 それらを盛り込んでいけば10どころでは済まないはずです。何百通りできます。 オブジェクト指向を盛り込んでみようとか、継承とか、フレームワーク利用してみようとか。 「できる、わかることだけ」やっててもトレーニングの意味がありません。 私が現実にあなたのその回答を渡されたら突っ返します。 簡単な課題と舐めないように。なぜ「10通り以上」と但し書きがあるのに「ほぼ10通りに近い数」と、未満であるような状態で報告しますか? トレーニングの本質を理解していますか?「やれって言われたから適当にやった」ではお勉強にすらなってません。 問題解決をしてください。
m.ts10806

2019/04/02 08:27

ちなみに、この課題だけで3日くらい悩んでもいいと思ってます。 考える力、ロジックが身に付くので、下手に昔作ったプログラム相手に何日も遊ぶよりずっと有用です。なぜか、は考えてください。 これまでの私の回答やコメントにも幾らでも散らばってます。
m.ts10806

2019/04/02 08:45

ちゃんと意図を理解できてるか不安になってきたので追記。 「「要件を満たしてればそれでOK」です。」 と「例題を出します」の間は読んで理解してますか? 要件は「Hello Worldと画面出力すること」 だけです。それさえ満たせば何をやっても構わないわけです。小綺麗に書く必要もなく、処理速度を気にすることもなく、手段は問わないわけですよね。 DBから取得する、としてもデータの持ち方だけで無限に遊べます。それはオブジェクト指向も同じ。 まずは自分の持ってる武器だけで戦うのをやめましょう。でないと、パターンは増えません。PHPマニュアルを使いこなすいい機会だと思って没頭すると良いです。 3日過ぎれば今回の質問にあげたような「掲示板」という一見単純な題材が如何にやりようがあって、成長のチャンスになるか、自分自身で気づけるはずです。 Hello Worldだけで無限に遊べるわけですよね。それから比べたら掲示板なんて題材、遊びの宝庫じゃないですか? (逆に言えば、それに気づくまで掲示板には手を出さないでいいくらい)
newyee

2019/04/02 12:02

あまり小ぎれいなコードとは言えないかもしれませんが、オブジェクト指向を調べながら、取り敢えず、10通り、出力することができました。 確かに、helloworldと出力するだけでも、何通りものやり方があるのだなと思い、勉強になったとは実感しています。
m.ts10806

2019/04/02 12:09

「やり方がある」のではなく「やり方を考える」です。 それができないと仕事には絶対につながりません。10パターンはほぼ未経験の新人が到達するスタートラインでしかないことを認識してください。 ということで、あと2日、頑張ってください。この程度で終わらせても何の意味もないですからね。でないと今出したという10パターンすら無駄になります。 (正直「できました」では誰も信じないですよ。結果が全てなので。口だけなら誰でも言えます)
newyee

2019/04/02 13:11

あと2日、というのは、この10パターン以上を考える、ということでしょうか? >>正直「できました」では誰も信じないですよ 以下に、コードを掲載します。 <?php require_once 'test_separate.php'; print 'Helloworld' . '<br>'; function a(){ echo 'HelloWorld'; } a(). '<br>'; class hello extends msg_cl{ use msgTrait; private $message; public function __construct($msg){ $this->setMessage($msg); echo $msg . '<br>'; } public static $string = 'HelloWorld'; const ST ='HelloWorld'; public static function a(){ echo 'HelloWorld<br>'; } public function setMessage(string $msg){ $this->message = $msg; } public function getMessage(){ return $this->message; } public function getclMessage(){ return $this->msg1_cl; } } $st = new hello('HelloWorld'); $st->a(); echo hello ::ST . '<br>'; hello::a(); echo hello::$string . '<br>'; $aaa = $st->getMessage(); echo $aaa; $st->trait_msg(); $st->show(); ?> <?php trait msgTrait{ private $msg = 'HelloWorld'; public function trait_msg(){ echo $this->msg; } } class msg_cl{ private $msg1_cl = 'HelloWorld'; public function show(){ echo $this->msg1_cl; } }
newyee

2019/04/02 13:15

>>口だけなら誰でも言えます もう少し、言い方どうにかならないでしょうか...?なんか嫌味たらしく聞こえますよ...
m.ts10806

2019/04/02 13:19 編集

さすがにコードをここにベタで貼られても困りますね。 paiza.ioとかcodepenとかgithubとかもっと適切な場所があるでしょう。 それにどれが1つの組なのか分かりません。提出するなら相手のことを考えてください(質問するときと通じるものがありますね) >あと2日、というのは、この10パターン以上を考える、ということでしょうか? コメント全部見直してください。私は無駄な文章はほとんど(いや訂正、全く)書いてません。 「長文だ、無理」と読み飛ばしてるからこちらの意図が全く伝わってないんですよ。 何度も言ってますね。点でも線でも面でもなく立体的に物事を捉える。 点でしか見てないのがよく分かります。(動物病院云々言ってた質問者さんはいずこへ。)
m.ts10806

2019/04/02 13:18

>もう少し、言い方どうにかならないでしょうか...? 淡々と事実と正論で指摘しているだけです。こんなことでいちいち感情的になっていても身が持たない。 逆の立場になったとつもりでこれまでの自分のコメントを見てみては。
newyee

2019/04/02 13:31

「動物病院云々言ってた質問者さんはいずこへ」 よく覚えていますね... まぁ自分は、教えて貰っている立場ではありますし、多少のことで文句を言うのもあれですしね...
m.ts10806

2019/04/02 13:38

覚えてたわけじゃないですよ。「どんな質問してきただんろう」というのはどんな質問者相手でも気になるものです。初めてならマークダウンの使い方とかわからないだろうし、とか質問編集したことがなければ編集できること知らないだろうし、とか。 どんな質問をしてきたか、とか。人となりを知っていることで回答の仕方や方向性も変わってきます。「言っても聞かなさそうだからやめとこう」とか。まあそれはその時その時。 だから言ったじゃないですか。「逆の立場になればわかることがある」と。「一度回答するつもりでほかの質問を見てみて」と。
m.ts10806

2019/04/02 14:02 編集

出させるばかりだと不満でしょうから、私もちょっとだけやりました。 「15分」と自分で制限時間設けたので、10個”以上”出すほど時間はとってませんがとりあえず挙げられたもの以外で8個 https://paiza.io/projects/CWsg4YbTgQuc9qyRqJ2mkQ もっと簡単なところからやれば幾らでも数は稼げますよ。 特にPHPは文字列や配列操作の関数は豊富です。文字列や配列の持たせ方次第で幾らでも作れます。 15分そこらでこれだけ出せたわけですから、1時間とか1日とかかければどれだけ出せそうかは想像できませんよね。10そこらで止まるようなものではないです。
m.ts10806

2019/04/03 01:53 編集

ということで、「オブジェクト指向に入る前に、ユーザー定義関数を使う前にも幾らでもやれる(やる)ことはある」ということが伝わればと。(それにオブジェクト指向でもユーザー定義関数でも結局扱うのはデータ。文字列や配列です。適切に的確に使いこなせないと有効活用はできません) だから、べた書き掲示板プログラムは幾らでもやりようはある。以上です。
BluOxy

2019/04/03 01:41

>もう少し、言い方どうにかならないでしょうか...?なんか嫌味たらしく聞こえますよ... 指摘は人格否定ではないことを理解すると良いです。自分が一生懸命書いたコードに対して手厳しく指摘を受けるのはつらいことかもしれませんが、それは人格否定ではありません。あくまでコードの話です。成長のためには指摘を素直に受けとることが大事です。 と、少し古い記事に書いてあったので載せておきますね。 https://qiita.com/Knbass/items/434ae074b2aac5b0f9f7#%EF%BC%93%E3%81%AA%E3%81%9C%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AA%E3%81%AE%E3%81%8B%E3%82%92%E8%AB%96%E7%90%86%E7%9A%84%E3%81%AB%E8%AA%AC%E6%98%8E%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8 私も以前、上司が厳しい方で鋭い指摘を何度も頂きましたが、そのおかげで回り道をせず自分の抱える問題が明確になり、問題解決をするための考え方を知ったので、今ではその上司の方に感謝しています。感謝を伝える前に転職されてしまったのでとても心残りがありますが…。 指摘されることは厳しいと感じられるかもしれませんが、同時に優しくもあるのです。 newyeeさんは今せっかくmts10806さんのようなベテランの方から優しく厳しく教わっているのですから、今回のような指摘を機に問題解決の考え方を身につけられるとより良い成長ができると思いますよ。 老婆心ながら、首を突っ込んでしまいました。 失礼します。m(__)m
newyee

2019/04/03 05:15

paizaのコード拝見させて頂きました。 配列を出力する方法としまして、implode関数はかなり便利ですね...foreachなどでしか、配列を展開する方法が思いつかなかったので、勉強になりました。後、PHP_EOLを改行に使うのも、便利ですね。自分のコードでは、全て出力する文字に「'<br>'」をつけていたので、コードがみにかったもので...
newyee

2019/04/03 05:18

>>老婆心ながら、首を突っ込んでしまいました いえいえ。ご親切にありがとうございます。
m.ts10806

2019/04/03 05:41

ブラウザに出力するという要件ではないので改行コードで十分です。 まあ、結局はそこじゃないんですけどね。点でも線でも面でもなく立体的に物事を捉えてください。 オブジェクト指向 は結構ですが有効活用するためには結局はデータの操作が適切的確にできる必要があります。要件を満たすため、問題解決をするため。 でないとオブジェクト指向を概念だけ形だけ分かったとしてもベタ書きからは抜け出せません。 オブジェクト指向もあくまで問題解決の手段、関数切り出し切り分けも手段。 道具です。使い方を覚えただけでは使いこなせません。 それに私の回答の大元である「要件さえ満たせればそれでOK」を忘れてはいけません。 別にユーザー定義関数で共通化をしなくても、オブジェクト指向で作らなくても、動けば使う側は関係ない。開発者側のさじ加減やエゴです。 データだってDBに持つ必要ありません。 ではなぜDBにデータを持つのか? なぜ共通化をするのか?オブジェクト指向で作るのか? 動機付けや目的、目標が必要です。 要件を満たすため、問題解決をするために道具を使うわけです。「ただなんとなく言われたから、やりたいから」ではベタ書きの方がマシなものができあがります。 m6uさんの回答にあるように「なんのためにするのか」考えてください。 「自分の勉強になるから」以外のメリットをきちんと理解して取り入れてください。プログラミングの本質は問題解決。 「自分以外の誰かの」問題解決です。勉強になるのは自分だけですね。 何の問題解決になるのか、きちんと考えてください。 現場では1人で全てを対応することはほとんどありません。勉強ではないですからね。
m.ts10806

2019/04/03 09:12 編集

※先に言い訳。スマートフォンから投稿したので読みづらいところ、誤字脱字あるかもしれません。夜に少し調整するかも。 コード確認しましたが、traitを使ってみたりオブジェクト指向に手を出して見ようという姿勢があるのは非常に良いことだと思います。 が、 あまりダメ出しばかりしたくないのですけど、全てNGです。 要件を正しく理解してますか? ‐‐‐‐ Q.「Hello World」と画面に出力しなさい。 ‐‐‐‐ 自身の出力結果を見てください。どこかおかしいところに気づきませんか? 私の解答の出力結果と違うところはありませんか? はい。 間に半角スペースが足りてませんね。私の出力結果を見て気づくこともあるかとは思いましたが、そうではないみたいですね。 プログラムは書いた通りにしか動かないのと同じで、要件も100%満たすのが大前提です。改行のことなんて本来どうでもいいこと。蛇足です。 つまり、既存システムの改修に乗り出す前に「本当に要件が全て満たせているか」の確認は絶対に必要。業務上では単体試験とか結合試験とか総合試験によって不具合だけでなく要件を満たせているかも見ます。正常動作だけではなく、異常系、またモンキーテストというのも行います。 「動けばいい」は要件が満たされて初めて言えることです。 さて画面に文字列を出力するという課題でNGを受けている状態で、「掲示板」という仕組み、どこまで要件を満たせているでしょうか? 「全て開発者が想定した通りに操作する」前提で組んでいませんか? 学習中であればそれで良いかもしれません。 でもサービスは全く知らない他人が使うものです。どんなに説明書を丁寧に書いても思った通りに操作してはくれません。 (teratailの丸投げ質問のように。あれだけしっかりと「質問するときのヒント」「推奨されていない質問」のページが充実しているのに) そこを「どこまで想定するか」は仕様の世界。設計の世界となるわけです。 問題解決の範囲を明確にするわけですね。(これはリファクタリングの際も同じです) te2jiさんはじめ、設計についてよくツッコミを入れる回答者がいます。今回もついてますね。 それだけ設計はシステム、サービスの肝です。要件は設計により全て網羅されるからです。コーティングしかしないプログラマーも設計書からきちんと要件を読み取る能力も必要ですし、設計する側は更に全体を見る力が必要です。 以下、細かい指摘。 「全て出力する文字に「'<br>'」をつけていた」と仰っていましたが途中と最後の方いくつかついてません。 コーティングには一貫性が大事です。 先に「どれが1つの組なのか分かりません。提出するなら相手のことを考えてください」と書きました。 対応されてませんね? ロジックは多少汚くても構いませんが、せめてコードはきちんと読みやすくインデント、改行をつけましょう。 私の解答コードは一貫性をもって書かれていることがわかると思います。 コードを読みやすく書くのも「技術」です。どんなに素晴らしいコードでもインデントぐちゃぐちゃ、改行が適宜行われてない、ネーミングルールがない だと読む気をなくします。 実際の現場では、特にPHPは自由度が高い分、スパゲティコードになりやすいと言われますから、そういうコードを相手にしていかなければなりません。実際は「現場の雰囲気に倣って書く」という空気を読む力も必要。その中で邪魔にならない程度に自分のポリシーを持つことも必要。結構経験値が必要な仕事です。teratailの質問で出されるコードは・・・まあそういうことです。これもトレーニングになります。 回答を得るとうことは、単に結果そのものではなく、書き方も真似ができるところになります。 こういうものは「書いてからフォーマット調整する」のではなく、「ルールを決めてその通りに書く」のが通例です。 ルールを「設計」と置き換えたらどうでしょうか。同じですね。 何かシステムなりサービスなり作り上げるにも「設計」という「ルール」を設けるのが先です。 コーディングするにも「コーディングルール」を設けるのが先です。 その通りに書いていくことで一貫性もあり、読みやすく、メンテナンスもしやすいものができあがるわけです。 無法では何も成り立ちません。 物事を立体的に捉えることができたら、もっともっとあなたに不足していて、大いに成長の糧となる“資産”がたった57行程度のサンプルコードにも詰まっているはずですよ。 だから「簡単な課題といって舐めないように」と書きました。 これも“資産”です。あなたの捉え方次第でゴミにも生涯の宝にもなり得ます。 あなたはこれまで質問についた回答をきちんと宝にできていますか? お説教だから直接質問の回答になってないから長いからとゴミにしてませんか? 熟考してください。 ※勘違いしないでいただきたいですが、これは決して押し付けなどではありません。 受け取りたくなかったらそれはそれで結構。あとは好きにしてくださいとしか言えません。 それでどうなるかはそれこそ熟考してはもらいたいですが、それも強制はしませんよ。 あなたがどこでどう潰れようと本来赤の他人であるあなた以外のユーザーはあなたがどうなろうと知ったこっちゃないのが現実です。 つまり、実体は無責任です。どう捉えようとあなた次第。 生かすも殺すもあなた次第。殺したかどうかはアドバイスした回答者のみ知る。 ちなみに私はteratailでは数えるのが面倒なくらい殺されてます。 私のアドバイスを殺した人がどうなったかは・・・興味があれば見てみると良いです。 想像しているよりも悲惨な状況だと思いますよ。
newyee

2019/04/03 10:11

アドバイスありがとうございます。 アドバイス頂いた通り、「なんの為にやるのか」ということを意識して、学習していこうと思います。 現状の掲示板のコードなのですが、実際に、掲示板は、既存のコードを見ずに作れるくらいにならなければダメですよね...?もう一度、既存のコードは見ずに、自分の力のみで、作ってみたいと思います。
m.ts10806

2019/04/03 10:31 編集

かなり長文で長いやり取りになってしまったので全部受け止めようとするとパンクするかもしれません。 (ここは思うこと全て毎回だしきってしまう私の悪い癖です) ので、マニュアルを読むような気持ちで読みといてもらえたらと。 >掲示板は、既存のコードを見ずに作れるくらいにならなければダメですよね...? はい。大正解です。 コードどころか設計から入ってみましょう。 確かに掲示板はありふれたシステムで基本的な動作、操作が組み込まれています。優良なサンプルコードも多い。 CRUDはもちろん、データの送信、受信など基本の宝庫です。 だからこそ、「基本」が身に付いているか見るには格好の材料にもなり得ます。 今回の課題もそうですね。私も手元にサンプルがあったわけではなく、何もない状態から書いています。たぶん新人に渡した解答とは一致しないでしょう。 ようやく私の本回答の最後の1節の意図が伝わって良かったです。 ※ひとまず、今回の課題、指摘内容反映してもらえますか?ここで確実におさえておくと、今後の「良い癖」につながります
m.ts10806

2019/04/03 10:29

あと、気が向いたら今回出たパターン以外、出せるかやってみたら良いです。時間を区切って。 自身の考える力の確認にも使えます。(そういった意味ではFizz Buzzは更に有用かもしれませんが)
newyee

2019/04/03 10:59

>>マニュアルを読むような気持ちで読みといてもらえたらと。 分かりました。ありがとうございます。しっかり読ませて頂きたいと思います。 >>ひとまず、今回の課題、指摘内容反映してもらえますか? 分かりました。githubのアップロードしたファイルの更新の仕方が分からないので、修正しましたら新しくまたアップロードさせて頂きたいと思います
newyee

2019/04/04 00:55 編集

一点自分のアップロードしたHello worldと出力したファイルで気になった部分があるのですが、「<br>」を入れているのに、改行されていないで、繋がってしまっている部分があります。原因が分からない為、そこの部分見て頂くことできますでしょうか?
m.ts10806

2019/04/03 12:08

即反応できるかコードすぐ見れるか分からないというのはご理解の上ですよね?自分でデバッグしたほうが身になるのは理解の上で自分のコードを他人にデバッグしてもらおうとしているのは認識の上ですよね? (コメントはしてますがコードをすぐ見れる環境下にいるわけではないです。ここで「作り直してみよう」となれば良かったのですが…) 確認するのはやぶさかではないですが、自分のコードは自分で責任を持てるようになりましょう。 たぶん確認するまであと一時間は待ってもらうことになりますけど、それでも良ければ。 たぶん、本当に大したことではないはずですよ。
m.ts10806

2019/04/03 12:41

ちなみに「どこに出しているつもりなのか」仕様はあなたしか知りません。 どこのことか言われないと「組まれたように出てますね」としか答えようがないです。 コードだけで仕様をくみ取るのは無理ですので。(teratailで質問するときと同じですね。「うまくいかない」って言われても何も分からない)
newyee

2019/04/03 12:45

あ、もちろん理解はしています。 コードの方、修正&整理してみたのですが、やはり何故か分からないのですよね... githubの方に、修正したコードの方、アップロードさせて頂きました。 ファイル名は、「test_2.php」「test_separate2.php」です。 開発環境はxamppを使用しています。ブラウザはgooglechromeです。
newyee

2019/04/03 12:46

チェックは時間のある時にして頂ければ、幸いです。 お願いしている身ですし、急いでいるわけでもいないので、大丈夫です。
m.ts10806

2019/04/03 12:50

(2回目) ちなみに「どこに出しているつもりなのか」仕様はあなたしか知りません。 どこのことか言われないと「組まれたように出てますね」としか答えようがないです。 コードだけで仕様をくみ取るのは無理ですので。(teratailで質問するときと同じですね。「うまくいかない」って言われても何も分からない) と、いうか 急いでないならそれくらい自分でやりませんか? デバッグの練習と思えばそれもまた自分のためにもなります。 (それにそのお願いの仕方は、お金を払ってやってもらうときの依頼の仕方ですよ)
m.ts10806

2019/04/03 12:53

ちょっとした不具合(もちろん組んだのは人間なので自分の責任)で何日も悩むとか普通にあることです。 自分で組んだものを他人に仕様も説明せずに丸投げするのはこれまでの私のアドバイスをゴミにしたと感じました。 逆の立場になって考えてください。いい加減。
m.ts10806

2019/04/03 12:54

また、今回の流れを最初からやりますか?さすがにそれは勘弁してください。
newyee

2019/04/03 12:59

>>どこに出しているつもりなのか」仕様はあなたしか知りません ここの部分についてなのですが、開発環境とか、そういったことを言われているのではないのでしょうか? 仕様とはなんでしょうか?
m.ts10806

2019/04/03 13:06

どこをどう理解したらそうなるんでしょうか。誰も開発環境の話してませんよ? あなたが自分で書いたコードですよね。コードの仕様を知ってるのはあなただけですよね。 「ここにこういう情報を出すつもりで書いた」はずですよね。私はどういうつもりで書かれたコードか全く知らないです。 「「<br>」を入れているのに、改良されていないで、繋がってしまっている部分があります」 って書かれても、どこの話かあなたしか知りません。 ですから「組んだ通り出てるね」としか言えないわけです。 あなたが全部点でしか私のコメントを見ていないためコミュニケーションが成り立ってません。 ずっとです。今回に限らず。 同じこと何回言われてますか?そのことに対して何も思うところはないのでしょうか。 「年寄りだから同じこと言ってる」くらいに思ってませんか?身の程を知ってください。
newyee

2019/04/03 13:08 編集

>>あなたが全部点でしか私のコメントを見ていないためコミュニケーションが成り立ってません。 読んではいますよ。ただ、「コードの仕様」という意味が抽象的であった為、分からなかっただけです
m.ts10806

2019/04/03 13:15

「読んでいる」と「理解している」は違います。 おそらく日本語話者であろうあなたに日本語で書いているのだから読めるのは当然と思います。 あなたの発言は全て点です。線にすらなっていない。 だから返信のため引用している部分も重要な部分でないところも多い。「いやそこじゃないんだけど」旨の指摘、結構受けてますよね。そのことに対して何も自身を省みるところはないですか? 省みることもないくらいの理解力の持ち主でしたら、質問サイトなんて必要ないはずですよ。 だから身の程を知れと言っています。前から指摘しているかもしれないけど、あなたは自分を高いところに置きすぎです。 あえて突っ込んでないけど、意味が通じなくなる誤字、結構やらかしています。 2019/04/03 22:08 のコメントに限らず。 そこを気にしない人にプログラミングは難しいと思います。書いた通りにしか動かない。 誤字脱字は致命的です。
newyee

2019/04/03 13:20

「中傷的」って書いた所ですよね?修正しましたよ。他の部分も、間違えたと気づいた部分は修正していると思います。
m.ts10806

2019/04/03 13:23

はぁ。 >「<br>」を入れているのに、改良されていないで、 <br>を入れて改良されないって何ですか。私には理解できませんでした。別の単語になおせば意味は通じますけど。 こんな目の前に意味が通じないものがあるのに灯台下暗しとはよく言ったもんです。 1個でれば100個。どれだけ自信があるんでしょうか。
m.ts10806

2019/04/03 13:35

この誤字の件だと 言われたことだけやる=点 ↓ 言われたことに関連しそうな項目を探して対応する=線 ↓ 言われずとも今後同様の問題が起きないように前もって工夫する=面 ↓ 相手のこと、今後の展開も見据えて対応する=立体的 まあ学生?っぽいですしお若いんでしょう。仕方ないかもしれませんが、 プログラミングをやっていく上で障害にしかならない性質なのは間違いないですね。 「点じゃなくて線じゃなくて面じゃなくて立体的に物事を見よう」と何度も言ってます。 経験は必要でしょう。でもそれは常日頃から意識しておかないと経験は積み上がりません。 本当は今直面している問題を解決して、次の学習に進んでいかなければならないはず。 それが本筋とはおおよそ関係ないところで時間をとられているのが「点でしか物事を見ていない」何よりの証拠です。
newyee

2019/04/03 13:58

コメント欄なので、多少はプログラミング書く時ほど、念入りにはチェックしていないですし、誤字ってしまうときもあると思いますがね。 hello worldの件は、自分でもう少し見直してみます。
m.ts10806

2019/04/03 14:02 編集

(2回目)そこを気にしない人にプログラミングは難しいと思います。書いた通りにしか動かない。 誤字脱字は致命的です。 文字でしかやり取りできない場所でその文字を大事に出来ないのは大きなコミュニケーションロスを招きます。そこを開き直られるとなると、つける薬は私にはもう見当たりません。
newyee

2019/04/03 14:26

いえ、自分が言っているのは、あなたの考えでは、誤字をする人間=プログラミングには向いていない(やるべきではない)のように言っているかのように、聞こえましたので、それは違うんじゃないかと言いたかっただけです。
m.ts10806

2019/04/03 14:56 編集

開き直った反応した件については何もなしですか、そうですか。 思い込みも激しいとなるとこれは厳しい。 「そこを気にしない人」がなぜ「間違いをしない人」に変換されるのかそのロジックは知りたいですね。 各所で「プログラミングはトライ&エラーだ」とコメントしてる私ですが、それは間違いは起こるものと分かっているから。 間違いがないなら動作確認試験は不要ですよね。質問や回答、コメントに編集機能は不要ですよね。 本質、捉えようとしてますか?自分をどこに置いて話してます? まあ、直接言わないだけで思ってる人は複数いるとは思いますよ。あなたが向いてない人だと。私ではない別の回答にもほぼそのままのコメントが書かれていたこともありますね。気づいてないみたいですけど。 私は向いてなかろうと関係はないとは思いますが、無駄な労力は掛けてほしくないとは思ってます。 今回の一連の件を今まさに無駄にしようとしてませんか?それに気づきませんか? 素直に聞いていれば良かったところを脇道にそれて大幅にロスしていると思いませんか? 素直に受け取れていたらあなたが課題で書いたコードのいまだに私に伝わってない「うまくいってない」ところなどとっくの昔に解決していて次に行けたと思いませんか? 立体的は難しくてもせめて面くらいには早急に捉えられるようにならないと、 気づかないうちに問題だけが山積みになって全て半端なまま手に追えなくなってドロップアウトすることになりますよ。
m.ts10806

2019/04/03 14:48

せっかく「成長のためには指摘を素直に受けとることが大事です。」 と他のかたからアドバイスがついたのに、それも無駄にしようとしてますよ。
newyee

2019/04/03 15:04

>>あなたが向いてない人だと 向いていないかどうかなんて最後まで分からないと思いますけどね。これから先も、勉強を続け、エンジニアを目指すつもりでいますし。 少し前のやりとりで、あなたがhello worldのコードについて仕様を説明されていないから理解できないと、僕を攻め立てましたが、初学者ということを理解しているのも関わらず、「仕様」がどうたらと抽象的な言葉で説明するというのは、どういう意図があるのか理解しかねます。 「素直に受け取れていたら」と言われますが、僕は初学者なりにあなたの説明を精一杯理解しようとしています。
m.ts10806

2019/04/03 21:04 編集

初学者であろうとなかろうと、開き直っていいというルールはないです。プログラミングの問題ではなく、コミュニケーションの問題です。 「仕様を説明されてないから理解できない」ではないです。 「どういうつもりで書いたコードか分からない」です。teratailの丸投げ質問と同じ。どういう結果を望んで書いたコードかなんて本人しか知りませんよね。 具体的に◯◯と出すつもりでコードを書いたけど、△△のようにでてしまう、と書かないと本人以外に誰も分からない。 (何回も質問してきてこの指摘を受けているということが何よりのロスです) いつまで点で話を続けますか?同じ指摘を何度うけたら分かってもらえますか? プログラミングそのものの話で分からないならまだ仕方ないですが、そうではないですよ。 今回に限らず、コミュニケーション部分の問題が大半です。 人格否定に走りたいわけではないですが、ここまでとなるとプログラミング以前の問題になります。そこのアドバイスをする場所ではないですが、コミュニケーションがまともにとれなければそもそもプログラミングに関しても会話が成り立たないのでそうするしかなくなります。
newyee

2019/04/03 23:45

「仕様を説明されてないから理解できない」ではなく、コードにおける仕様という「意味」はなにかと、聞いているのです。逆の立場になってくださいといいますが、では逆に、あなたは初学者の立場になって説明されているのですか?僕にはそうは思えないです。あなたは僕が初学者であることを理解されているのも関わらず、抽象的な説明で、それを理解できなければ、一方的に攻める、あなたとやりとりしてきて、こういった印象を強く感じますね
m.ts10806

2019/04/04 00:05

一通り読み返すといいです。 抽象的も何も具体的にしか書いてません。 あなたが点でしか見てないだけです。流れを見てください。前後もきちんと見てください。 3回も同じことを書くことになりますが、それでも良ければ。 プログラミング初心者には向けていますが、コミュニケーション初心者には向けてません。 「"仕様"という字を辞書で引いてみましょう」というところからアドバイスが必要でしょうか。
newyee

2019/04/04 00:31

あのですね... 「仕様」といっても色んな意味があります。コードの仕様を説明しろと言われても、普通はなんのことだか、分からないです。あなたは、仕事でプログラミングをしているらしいので、そのような言葉を使うのは当たり前で、相手にも伝わるのかもしれませんが、初学者にそれを言っても理解されないですよ。 自分の説明に絶対の自信があると見受けられますが、他の初学者の方がみたら、どういう印象を受けるでしょうかね。あなたも、人に意見を聞かないというのなら、自分ももっと人の意見を取り入れた方がいいと思いますがね。
m.ts10806

2019/04/04 00:45 編集

「コードの仕様の説明をしろ」 どこに書いてますか? そして、「仕様」という単語だけにいつまで引っ張られるんですか? 私結構待ってます。下記の詳細説明。 >「<br>」を入れているのに、改良されていないで、繋がってしまっている部分があります。 brの話をされるので「改良」を「改行」と読み替えることは可能ですが、修正されないところを見ると「改良」が正しいのかもしれない。ただ「改良」では前後とつながらないし、「改行」としたとしてもどこにどう改行を入れたつもりなのかはあなた以外に誰も分からないわけですよね。 「ここにこう改行を入れたいです(あなたの考えた仕様)。けど、現状こうなっています」という説明は必須です。 teratailで質問するときにどうしてますか?問題解決したいのでしたら、相手に状況伝わるように説明してください。 急ぎでないからと手を抜くのは単なる怠慢です。半端に投げられたまま枝葉ばかりにコメントされる私はどうすればいいですか?
newyee

2019/04/04 00:56

仕様を説明しろと直接は言っていなくても、誰がみたって説明しろといっているんだなと思いますよ... >修正されないところを見ると「改良」が正しいのかもしれない 明らかにそうじゃないことというのは返信をみて気づきませんでしたかね...
m.ts10806

2019/04/04 01:42

枝葉と点ばかりに気をとられて本筋に戻れませんね。 すごーく乱暴に言います。 -------- ちゃんとコード見てやるからさっさとどうなるつもりで書いたコードなのか説明しやがれってんだ。 こっちは"[Hello World]と出力しろ"としか伝えてねーんだよ。 それ以外はお前のさじ加減で作ったんだろ? お前以外どうなるのが正しいかなんて知らねーんだよ。 どうなるのが正しいのか知らねーから見たくても見ようがねーんだよ ------- プログラミング的に書くと(理解できないかもしれないので以下はいつか参考にするだけで結構)。 こちらは要件を伝えたのみ。それにそって設計、製造、動作確認をしたのはあなた。どういう設計なのかはあなた以外誰も知らない。 コードだけで設計まで推し量るのは無理。設計が分からなければどうなると正しいかは分からない。要件が満たされてない、書いた通りに出てるね、というのことしか分からない。 どういう設計に基づいて、どう作るつもりでコードを書いたのか説明してください。
newyee

2019/04/04 02:30

githubにあげました、「test_2.php」ですと、自分としましては、縦一列に、Hello Worldが10個出力されると、想定していました。 「Hello World」 「Hello World」 「Hello World」 「Hello World」 といった具合にです。しかし、実際は、一つ目の「Hello World」の隣に「Hello World」と表示されており、さらに、上から8つ目の「Hello World」の隣に「Hello World」と表示されていました。 しかし、今、自分でデバッグをしていましたら、解決することができました。 要件、設計、仕様などの言葉に慣れていなかったので、理解できない部分はあったのですが、なんとなく、完全ではないですが、ご回答の意味が分かってきました。
m.ts10806

2019/04/04 02:41

「改行」も「改行コード」「改行タグ(html)」と最低でも2種類あるのでできればそこも正しく表現したほうが良いですね。 phpも全てブラウザで参照されるわけではないですし、php自体はどこから参照されるか知らないわけですから。 あとはコードを見やすいように更新しておいてください。 数日後とか自分で見たときにどこまでが1パターンなのか分からなくなりますからね。 そのあたり、下記のような記事はかなり参考になるし、耳が痛いところを突いています。 https://qiita.com/rana_kualu/items/95f0c8be51e8665015d5 https://qiita.com/tadsan/items/fb496e450fc27c8c4494
newyee

2019/04/04 04:25

helloworldの修正したコードの方、githubにアップロードしておきました。 qiitaの記事のリンク、どうもです。 今、記事の方、読ませて頂いていますが、かなり勉強になりますね。
m.ts10806

2019/04/04 04:33

>githubにアップロードしておきました。 後程確認します。 >今、記事の方、読ませて頂いていますが、かなり勉強になりますね。 「戒める」なので全て逆だったり対応されてなかったりした場合にどうなるかを考えながら読むと考える力も身に付きますし、身を引き締めるキッカケにもなります。 「今の自分にあてはまるものがないか(逆をやってしまっていることはないか)」振り返りながらどうぞ。
guest

0

これはモデリングの話ですね。
PG100人に聞いたら100通りの回答されると思います。つまり正解はありません。

見た感じリファクタリングできる箇所はMVCモデル化とGoFデザインパターンの導入でしょう。

一例ですがこんな感じにモデリングした後、実際の書き込み処理などを実装していく感じになるでしょう

php

1<?php 2//C&V 3// require_once(BBS_Model); 4 5$bm = new BBS_Model(); 6if($bm->init() === false){ 7 http_response_code(400) ; 8 exit(); 9} 10 11$bm->exec($_GET,$_POST); 12 13?><html>~省略~ 14 15<?= empty($bm->getError()) ? $bm->getMessage()['success_msg'] : $bm->getError() ?> 16 17~省略~ 18</html>

php

1<?php 2require_once('Db_connect.php'); 3require_once('config.php'); 4 5 6class BBS_Model() 7 private $conf; 8 private $db; 9 private $error_msg = []; 10 private $msg = []; 11 public function __construct(){ 12 $this->conf = new config(); 13 } 14 public function init(){ 15 $this->db = new Db_connect($conf);//「php db GoFパターン」で検索 16 if($this->db === false){ 17 return false; 18 } 19 } 20 public function exec($get, $post){ 21 //メインロジック 22 //エラー処理 23 if(isset($post)){ 24 $this->error_msg = 'Error'; 25 return false; 26 } 27 $this->saveComment($name, $title,$comment,$pass); 28 29 $this->msg['success_msg'] = '成功です'; 30 } 31 public function getError(){ 32 return $this->error_msg; 33 } 34 public function getMessage(){ 35 return $this->msg; 36 } 37 38 private saveComment($name, $title,$comment,$pass){ 39Value(':name',$name,PDO::PARAM_STR); 40 41 try{ 42 43~省略~ 44 $stmt->bindValue(':title',$title,PDO::PARAM_STR); 45 $stmt->bindValue(':comment',$comment,PDO::PARAM_STR); 46 $stmt->bindValue(':pass',$pass,PDO::PARAM_STR); 47~省略~ 48 $this->db->execute($stmt); 49 50 }catch(PDOException $e){ 51 die ('エラー:' . $e->getMessage()); 52 } 53 54} 55

投稿2019/04/01 08:47

namda

総合スコア705

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

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

namda

2019/04/01 08:50

ステマ?になりますが、ドメイン駆動設計などモデリングに関する書籍を読むことをおすすめです。 難しいですがこの領域はコンピュータ・サイエンスに食い込むのでトライアルアンドエラーで身につけていくしか無いと思いますね。
newyee

2019/04/01 11:58

ご回答ありがとうございます。 ご回答いただきました、「$this->db = new Db_connect($conf);/」こちらの部分なのですが、Db_connect.phpは自分のコードではクラスを記載しておりません。インスタンス化することはできるのでしょうか...?
papinianus

2019/04/01 14:56

回答依頼いただいたんですが、こちらの回答の方針を支持いたしますので、このコメントをもって回答といたします。 コメントとして方針を加えるとすれば、ビュー(描画するhtmlを書くソース)でselectとかいう文字をみたくないです。 bbs.php(bbs_1.phpになってない箇所がいくつかある)と、write_1とdelete_1の関係がおかしい(writeは遷移しておわり、deleteはLocationで戻している)。コントローラがきちんと役割立てされてない感じ。
newyee

2019/04/02 03:16

papinianusさんご返信ありがとうござます。 ご指摘頂きました点につきまして、コードの方見直して、見たいと思います。
namda

2019/04/02 03:41

解決済みになっていますが >ご回答いただきました、「$this->db = new Db_connect($conf);/」こちらの部分なのですが、 Db_connect.phpは自分のコードではクラスを記載しておりません。インスタンス化することはできるのでしょうか...? サンプルコード中のコメントにある通り、GoFのデザインパターン化する前提です。よって質問にあるコードのDb_connectではインスタンス化できません。 DBの抽象化は多くの人が作ってるのでそれを参考にするのがベストでしょう
guest

0

一度設計作業をちゃんとしてみれば?
掲示板であれば、設計サンプルはいくらでも入手できるし、設計作業ができなければ、そもそもコレ以上の規模でまともなコーディングができるわけないので。

タマゴとニワトリだけど、クラス図がそれなりの精度で書ければ、オブジェクト指向でリファクタリングするのも容易です。

投稿2019/04/02 03:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

newyee

2019/04/02 05:14

ご回答ありがとうございます。 正直な所、自分としましては、「設計」というものも良く分かっていませんでした... 掲示板の設計サンプル、調べてみたいと思います。
guest

0

ベストアンサー

学習のため、ってところが引っかかるのは私だけだろうか。
そして、まだオブジェクト指向のオの字も出てこないのも気になる。

なんのために分割するのかを見失ってますよね。

生産性を高めるために、
コードの再利用性を高めるために、
(もしかしたら)内部処理と見た目(見せ方)を分業するために分離する
ってのが本筋じゃないでしょうか。

その場合に、あなたがどういう観点で構造を変更すれば
生産性が高まり、コードの再利用性が高まるのか、
内部処理と見た目(見せ方)を分業できるのか、
っていう視点で考えればいいし、
分け方なんて人それぞれで場合にもよるのだから、
「こういう考え方に基づいてこういうふうにわけました」が正しく行われれば
それにツッコミの入れようはないはずです。

ちなみに、内部処理と見た目(見せ方)の分業について、
たった一人で開発する上では、一本のphpの中で
データベースの処理もhtmlやcssやjsのコードも全部書いちゃいますが、
規模が大きくなると分業することもあります。
分業を円滑にするためにフレームワークを駆使してみたり、
テンプレートエンジンを使ってみたりします。

と、前置きして、

Db_connect.php と config.php を分ける目的が、
システム全般的な設定事項を config.php にまとめてしまうのであれば分けててもいいし、
単にDB接続事項だけであれば Db_connect.php にまとめてしまった方が一行で済む利便性もあります。
分ければ、処理を起こす都度2行ずつ書くのを忘れなければいいのだし。
分けてあれば、ローカルのテスト用の設定とデプロイ先の設定をファイル差し替えで分けることもできます。
目的に沿っていれば、どっちでもいいんです。

でも、せっかくなら、 config.php に設定ごとを追い出しているのだとしたら、
環境依存的な事柄もそこに含めるべきで、
例えばデバッグ用の設定と思われる

error_reporting(E_ALL); ini_set("display_errors",1);

も追い出すと良いです。サーバーにデプロイしたときに不要(というか見直しする箇所)なので。

それと、今回投稿やコメントの更新処理が含まれていませんが、
更新処理をもし組み込んだとすると、
削除処理と更新処理で共通する処理というのも出てきます。
(書き換え用のパスワードが同じかどうかなど検証処理が)
そういうときどうするかも考えてみてください。

投稿2019/04/01 08:05

編集2019/04/01 08:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

newyee

2019/04/01 08:23

ご回答いただきありがとうございます。 学習の為、といいますのは、実は、オブジェクト指向を用いて、現在の掲示板のコードを書き換えようと思ったのですが、関数切り出しもできていないのに、早すぎる、などの指摘を受けた為、まずは、関数にて、処理の切り出しを行い、それができてから、クラス化などのオブジェクト指向を用いて、コードを書き換えていきたいと思い、関数切り出しを行おうと思いました。ですが、確かにご指摘の通り、なんのために、関数切り出しをするか、といったことはあまり考えていませんでした...処理を分けることで、同じ処理を書く手間を減らす為に行う、という漠然な目的しかありませんでした... 自分としましては、関数切り出しができるようになり、オブジェクト指向で書き換えられるようになれればという思いがあるのですが、何が正解か分からないといった所で、少し迷ってしまっている部分はありますね...
newyee

2019/04/01 08:28

「config.php」を作成した理由も、PHPの講義動画で、DB接続の際に、同じようにconfig.phpにて、DB接続情報を定数で定義したファイルを用意していたので、DBに接続する際は、あのように切り分るのが正解なのかなと、思ってしまっていたんですよね...
newyee

2019/04/01 08:40

そもそも、「config.php」が何の為のファイルか、ということもいまいち分かっていなかったです... PHPの講義の動画では、ご回答にも記載いただきました、「 ini_set("display_errors",1);」こちらの部分が、「config.php」に記載されていたのですが、これはわざわざ「config.php」に書く必要はないのではないかと思い、あえて消したんですよね... 実は、講義動画を見ている際、「config.php」に、今回ご質問させていただきました通りDBへの接続情報を含めていたのですが、そこも謎だったんですよね... 例えばなのですが、「config.php」には、 「 error_reporting(E_ALL); ini_set("display_errors",1);」こちらの処理のみを書き、他の処理は、「Db_connect.php」へ移すといったことでも、良いのでしょうか...?
退会済みユーザー

退会済みユーザー

2019/04/01 08:43

まぁ、言う人が違えば、また違うことを言うでしょうね。 なぜ違うことを言うのかも、視点が違うから、立ち位置が違うからだと思います。 例えばデータベースへのアクセスまわりも、 サーバーがmysqlでもpostgresqlでもどっちでも動くようにするために 内部処理と切り離してクラス化して隠蔽化するとか、ってなりますよねぇ。 内部処理と見え方を分離してMVCモデルで作り直すって視点でも良いでしょうし。 掲載されているコードは、単にアクション単位で分けましたって状態だから、 このまま進めようにもオブジェクト化をどういう視点でやるのか見えにくいです。
退会済みユーザー

退会済みユーザー

2019/04/01 09:01

config.php への追い出しについて、 各アクション単位のphpファイルを、デプロイ時にデバッグ向け設定箇所を改変しなくてもいいように、 config.php 一箇所で済ませたほうが楽って観点です。 怖いのは修正漏れなので。
退会済みユーザー

退会済みユーザー

2019/04/01 09:06

分け方を、単に今回の掲示板だけで考えるのか、 今後も類似の何かを開発する前提での再利用を考えるか、 など視点や立ち位置によって変わってしまうので、 namdaさんのいうデザインパターンは一度触れておいたほうがいいでしょう。
newyee

2019/04/01 09:11

ご返信ありがとうございます。 >config.php への追い出しについて 教えて頂き、ありがとうございます。 namdaさんのご回答も参考にさせて頂きたいと思います。
guest

0

こんにちは。

回答ではなく助言です。これで伝わってくれれば良いのですが。
「プログラムの分割」と言ってまずイメージできるものというと、一連の処理をぶつ切りにして、それぞれを分けて管理するやり方が挙がりますね。これを便宜的に「縦分割」と表現してみます。流れる一連の処理をフェーズ毎に切り分けた状態をイメージしてください。これに対して、オブジェクト指向は「横分割」であると言えます。縦横の表現でイメージできるでしょうか、横分割は言い換えると「処理の階層化」を行う構造化という意味です。この2つを混同して「切り分け」と表現してしまうのは、何も分かっていないと言われても仕方ありません。縦分割がいわゆる工場のラインを工程別に分けたものであるとすると、横分割は、小さなツールを「使う」小さなツール、を「使って作られた」大きなツール、を「使って」プログラムを作るものです。この積み重なる「階層化」のイメージを持って、今一度自分のプログラムを見直してみてください。どうですか?階層化できそうですか?自分にはできそうにありません。一度コードを捨てて一から考え直した方が良い、と言っていたのは、そういうことです。一から、考え直してみるのはどうでしょうか。鍵は「階層化」と「小さなツール」です。

投稿2019/04/01 12:41

tamoto

総合スコア4105

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

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

newyee

2019/04/02 03:21

ご回答ありがとうございます。 抽象的な捉え方になってしまうかもしれないのですが、横分割というのは、「処理の階層化」、縦分割というのは、一連の処理をフェーズ事に切り分ける、といった考え方で理解できました。 他のご回答者様のご回答なども、参考にさせて頂き、もう少し勉強していきたいと思います。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問