以下の内容は、10/6に行った第4回ソーシャルラーニング勉強会での会話記録です。
ちなみに、いつかやるだろうと思ってましたけど、
ハッシュタグの付け忘れ(2番目の発言、他にもあるかも)をしてしまいましたw
それでは、以下からスタート!
10月6日 kitoku @kitoku_magic
ピッピッピッピーン! #studyonsm
10月6日 kitoku @kitoku_magic
第四回のソーシャルラーニング勉強会のスタートです。女性の下半身がとにかく好きな、kitoku_magicです(苦笑)
10月6日 kitoku @kitoku_magic
ここ2か月、技術以外のテーマを取り上げてきましたが、今回は技術のお話にしました。やっぱりバランスが大切だと思いますので。 #studyonsm
10月6日 kitoku @kitoku_magic
で、今回のキーワードは「DRY」。Don't Repeat yourself。「同じ事を2回以上書かない」です。 #studyonsm
10月6日 kitoku @kitoku_magic
あ、あと、このページ http://kitoku1.blog129.fc2.com/blog-entry-175.html を随時開いておいていただきたいと思います。というか、コレを見ないと何がなんだか分からないと思いますので。 #studyonsm
10月6日 kitoku @kitoku_magic
ですので多分、今回はモバイルだと特に見づらい(か見えない)かなとは思うのですが、すいませんご了承下さいませ。 #studyonsm
10月6日 kitoku @kitoku_magic
では、本題に入ります。まずは、Part1から5のPart1から。先程のページの該当箇所をご覧頂ければと思います。 #studyonsm
10月6日 kitoku @kitoku_magic
クラス化もされていないし関数化もされていないソースですね。これを何というのかが分からないのですが、自分は勝手に「ベタ書き」と呼んでます。 #studyonsm
10月6日 kitoku @kitoku_magic
まず、パッとみて思うのが、「手数料を計算して加算する」とか「消費税を計算して加算する」って処理が、「2ヶ所」ありますね。さっきのDRYの話から、まずこれを「1ヶ所」にしましょうと。 #studyonsm
10月6日 kitoku @kitoku_magic
「別にたかだか2ヶ所を1ヶ所にしたぐらい、大した改善じゃないじゃないか」というのが、多分罠なんじゃないかなぁと思います。2ヶ所を1ヶ所にすら出来なければ、もっと数が増えたり、パターンが若干変わったりしている時に、対処出来ないのではないかと。 #studyonsm
10月6日 kitoku @kitoku_magic
なので、さっきの様な発言は、良いリトマス試験紙になるんじゃないかなぁと思います。技術的負債が増えるかもしれないと警戒した方が良いでしょうね(苦笑) #studyonsm
10月6日 kitoku @kitoku_magic
話を戻します。で、それを改善したのが、Part2のa.phpです。関数化してみました。 #studyonsm
10月6日 kitoku @kitoku_magic
で、コメントにも書いてますけど、ここが注意です。DRYは「同じ事を2回以上書かない」ですが、「同じ"意味"のコードを2回以上書くな」であって、「同じ内容のコードを2回以上書くな」ではないので、この場合関数も2つに分かれます。 #studyonsm
10月6日 kitoku @kitoku_magic
消費税は、なんか今度上がるとか何とか言ってましたけど、でも消費税と手数料は連動しませんよねと。というか、連動しちゃあ困りますわな(苦笑) #studyonsm
10月6日 kitoku @kitoku_magic
さて、これで処理が共通化出来ました。このソースの場合はですけど、1つのファイルだと正直これぐらいしかやる事は無いですね。でも、ファイル1つのシステムというのも、そうはないと思いますので。これからが重要だと思います。 #studyonsm
10月6日 kitoku @kitoku_magic
さて、ここまでで、何かご意見・ご質問等はありますでしょうか。お気軽にどんどんお寄せ頂ければと思います。 #studyonsm
10月6日 kitoku @kitoku_magic
では次です。今度はファイル(画面)がもう一つ増えました。Part3のb.phpです。こっちは、a.phpとは違う処理を行なっています。 #studyonsm
10月6日 kitoku @kitoku_magic
で、確かに違う処理を行なっているのですが、でも初期処理と終了処理の箇所は、全く同じ事をしていたりするんですよね。 #studyonsm
10月6日 kitoku @kitoku_magic
このソースは、Webアプリというのを想定(Smartyを使っているのもそれを暗示)していますけど、自分が見聞きした限りですと、Webアプリって殆ど(必ず?)このような作りになっているんですよね。 #studyonsm
10月6日 kitoku @kitoku_magic
で、どの画面でも、初期処理と終了処理は共通化出来るのが殆どでございまして、なのでココを共通化(DRYに)しちゃいましょうと。 #studyonsm
10月6日 kitoku @kitoku_magic
そして、新たに出来たのが、「initialize.php」と「finalize.php」です。あと、a.phpの方の初期処理と終了処理の部分も変更が入りました。 #studyonsm
10月6日 kitoku @kitoku_magic
さて、大分スッキリ。これでもし、「DB接続の処理を追加してくれない?」とかいうお話がきても、initialize.php「だけ」を修正すればよいということで、100ヶ所直したりする悲劇から免れることが出来るわけですね。 #studyonsm
10月6日 kitoku @kitoku_magic
さて、ここでは何かツッコミ等はありませんでしょうか? #studyonsm
10月6日 kitoku @kitoku_magic
Part4に進む前に、5分程休憩しましょうか。14時50分頃から再開します。 #studyonsm
10月6日 kitoku @kitoku_magic
さて、再開します。今度は、更にもうひとつファイルが増えました。Part4のc.phpで、メイン処理の一部がa.phpと同じになっています。初期処理と終了処理は全く同じです。 #studyonsm
10月6日 kitoku @kitoku_magic
じゃあ、またa.phpとc.phpで共通で使っている関数を、別ファイルに出せば良いのではということで、別ファイルには出しています。ただ、今度は「クラス」が付いています。 #studyonsm
10月6日 kitoku @kitoku_magic
で、別にコレ、クラスにしなくても、別ファイルに外出しするだけで、目的が達成出来ないわけではないんですよね。なのに、なんでクラスにしたのかと。 #studyonsm
10月6日 kitoku @kitoku_magic
これも、この時点では二つしか関数が無いので、クラス化する必要はないとなるのですが、色々な関数がこのファイル内に詰め込まれますと、分類がグチャグチャになって、読むのも整理も大変になってしまうと。関数100個とかになったら、大変じゃないですか。 #studyonsm
10月6日 kitoku @kitoku_magic
なので、まぁ今回のソースですとutilityとなっているので矛盾している様にも見えるかと思いますが、こういう場合、例えばその関数がSQL絡みだったらsql_utilとか、画面表示絡みだったらhtml_utilとか、http通信絡みだったら、続きます #studyonsm
10月6日 kitoku @kitoku_magic
続き、http_utilとか「パッケージング」すると、ソースも短くなりますし、良い感じになるかと思います。タンスの整理みたいなもんで、ジーンズとパンツとセーターを同じ所に入れないでしょうと。 #studyonsm
10月6日 kitoku @kitoku_magic
そういえば、タンスといえば・・・止めときます(苦笑) #studyonsm
10月6日 kitoku @kitoku_magic
で、あとココでは、関数をstaticにしています。で、今回の話と若干それますけども、手続き(関数やメソッドやファンクション)を共通化するだけなら、staticもアリかと思うんです。というより、継承とかしなければ、インスタンスをわざわざ生成する必要などないかと #studyonsm
10月6日 kitoku @kitoku_magic
でも、例えばコレが、変数を共通化(共"有"化かな)だと、変数の値まで更新されてしまう恐れが出てくると。さっきの例ですと、「とある金額を渡したら、その金額の5%分の金額をよこせ」という手続きなら共通化しても害にはならないのですが、続きます #studyonsm
10月6日 kitoku @kitoku_magic
続き、「とある金額」は、その手続きを呼び出した側によって違うので、そこを共有化しちゃうとマズいとなるかなと。 #studyonsm
10月6日 kitoku @kitoku_magic
ソースもなく、つたない文章でアレなんですけど、スーパーのレジに行ったら、買う物をレジに通すという手続きは良いけど、買う物を他の人と混ぜて多額の請求を食らうとかって感じでしょうかねw #studyonsm
10月6日 kitoku @kitoku_magic
で、ここで変数を共通化しちゃうのが、グローバル変数。永久不変に小さいプログラムなら、そう害は無いのですが、永久不変になるかどうかって、分からないですからねぇ。便利なのは否定しないんですが、自分の実体験もあるんでしょうけど、とても推奨は出来ないなぁと(苦笑) #studyonsm
10月6日 kitoku @kitoku_magic
さて、Part4はこの辺までで、15時30分頃から、最後のPart5に移りたいと思います。 #studyonsm
10月6日 kitoku @kitoku_magic
さて、再開です。最後のPart5。ところで、ツッコミなどはないでしょうか、いかがでしょうか〜 #studyonsm
10月6日 kitoku @kitoku_magic
さて、Part4のソースを見てみると、「require_once('initialize.php');」とか「require_once('finalize.php');」とかが、また2ヶ所以上ありますよと。なので、この辺をどうするか。 #studyonsm
10月6日 kitoku @kitoku_magic
あと、初期処理と終了処理だけ共通化出来たとしても、メイン処理は全ファイルで全部違うし、その辺を含めてどうしましょうかと。 #studyonsm
10月6日 kitoku @kitoku_magic
ということで、それを解決しているのが、Part5のcontroller.phpです。 #studyonsm
10月6日 kitoku @kitoku_magic
まず、初期処理と終了処理は、executeメソッド内に一つずつ書いてます。ここは、そう難解でもないと思います。 #studyonsm
10月6日 kitoku @kitoku_magic
で、各画面毎のメイン処理をどうするかって所ですけど、クラス名(=ファイル名)をリクエストパラメータに設定して受け取ります。 #studyonsm
10月6日 kitoku @kitoku_magic
で、少しコメントにも書いてありますけど、パラメータの値によっては結構ヤバい事になるかもしれないので、チェックしましょうと。 #studyonsm
10月6日 kitoku @kitoku_magic
で、どうやってチェックするかですが、例えば、クラス名が「login」だったら、クラス名を管理する設定ファイルにloginと追加して、requireする前に設定ファイルにある名前かどうかチェックしますと。勿論、設定ファイルはドキュメントルート外に置きます。 #studyonsm
10月6日 kitoku @kitoku_magic
これで、パラメータによって処理実行するクラスを変えて、万々歳ですよと。 #studyonsm
10月6日 kitoku @kitoku_magic
また、ファイル名が変わるというケースも少ないかと思いますけど、初期処理と終了処理のrequireも一つになりましたね。 #studyonsm
10月6日 kitoku @kitoku_magic
さて、でもまだ共通化が出来たりします。「メイン処理実行」の直前の「$obj->set_smarty($smarty);」なんですけど、この$objって画面によって違うので、クラスも別になるんですよね。 #studyonsm
10月6日 kitoku @kitoku_magic
でも、それだとクラスを追加する度に、set_smartyメソッドを追加しなきゃいけないではないかと。処理の意味が同じなのに、何とかならんのかと。 #studyonsm
10月6日 kitoku @kitoku_magic
そこで、今度見て頂きたいのは、model.phpと、a.phpです。a.phpには「extends model」とあるので、modelクラスが親クラスです。 #studyonsm
10月6日 kitoku @kitoku_magic
で、「$obj->set_smarty($smarty);」の$objが、「modelをextendsしたクラス」なら、modelにあるset_smartyを呼ぶことが出来ますよと。 #studyonsm
10月6日 kitoku @kitoku_magic
ということで、これでまた複数の箇所に書かずに済みました。 #studyonsm
10月6日 kitoku @kitoku_magic
「でも、executeメソッドは、どのクラスにも書いてるよねぇ」については、処理している内容が違うので、これはこうするしかないと思います。 #studyonsm
10月6日 kitoku @kitoku_magic
という感じで、これでMVCフレームワークですね。といっても、まだまだ機能は足りないですけど。 #studyonsm
10月6日 kitoku @kitoku_magic
では、そろそろ今回のまとめです。 #studyonsm
10月6日 kitoku @kitoku_magic
1.「たった2ヶ所ぐらいなら、大して変わらないでしょ」は危険信号。 #studyonsm
10月6日 kitoku @kitoku_magic
2.「なんか複雑だし、便利で楽なグローバル変数で良いでしょ」も危険信号。というかコレに限らず、「便利」とか「楽」とか言われると、自分は大抵疑います(苦笑) #studyonsm
10月6日 kitoku @kitoku_magic
3.同じ箇所が増えてからでは、「直そう直そう」と口には出たとしても、直す「気力」や「胆力」的に、負ける可能性大だと思います。なので、面倒だと思っても、一つも作り込まない気持ちを持って、ソースを書いていくのが大切と思います。痛い目にあえば分かると思いますw #studyonsm
10月6日 kitoku @kitoku_magic
さて、今回はこの辺で終了です。今日は、誰も来ませんでしたねぇ。何となく想像はついてはいますけども。 #studyonsm
10月6日 kitoku @kitoku_magic
で、次回なんですけど、いつも月初にやってますが、11月は微妙です。まだ分かりませんけど。だから、10月の最終週とかになるかもしれません。内容は・・・「銀の弾丸」か「負けられる強さ」辺りでしょうかねぇ。まぁ、例によって分かりません。 #studyonsm
10月6日 kitoku @kitoku_magic
それでは、今回はこれで終了です。kitoku_magicでした〜 #studyonsm