gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

validationについて考えてみる

「について考えてみる」三部作(って今決めたw)、最後の項目。
内容は「validation、をどこに実装するか?」てなお話です。

一旦、Webアプリケーションのお話で展開します。。
前提として、Modelのお話が出てくるんで https://gallu.hatenadiary.jp/entry/2019/05/13/213612 のあたりを一読しておいていただければ幸い。
以下では「Model ≒ ORM」なModelを想定します。
違う場合は「データの塊を扱う箇所 ≒ Model」って読み替えていただければ*1

前提として。
「validationはやるよねぇ」ってのは、一端そこは合意前提で。
いやまぁ「どれくらいがっつりやるのか」ってのはありますし、そもそもとして「valid(有効)ってなに?」ってのもありまして。
具体的には「日付のvalidation」は、その日付がグレゴリウス暦であれば比較的簡単かと思うのですが、それが「誕生日」だとすると「どこまでがvalidなんだろう?」というあたりでちょっとした議論くらいは巻き起こせる感じではあるのですが*2
とはいえまぁ「ある程度の落としどころ」を加減した上での「明らかにinvalidなデータくらいはブロックしたいよねぇ」くらいの感じ、を、一端想定していきたいと思います。

さて。
昔々であれば、こんな事を考える必要は(多分)無くて。
つまり

// 入力を受け取って
// validationして
// DBにinsertしたりupdateしたりして
// HTMLを出力する

的に、立て板に水の如く「書き流せば」よかったのですが。
昨今、これらを「1ファイルで一気に書く」事は比較的レアケースとなりつつあり。多くの場合は、いくつかのクラスを「有機的につないで」1つの機能にしているので。
そうすると「どこに書くの?」というのは、とても重要なんじゃないかなぁ、と、個人的には思うところでございます*3

いやまぁおいちゃんの中では(今のところ)大体決まっていて。
「データ保存の直前で、テーブル*4のレコード単位」って考えてます。
一般的なPHPフレームワークだと「Model」ですかねぇ。MagicWeaponだとdata_clump派生クラス。
理由は簡単で「validateは、一塊の"データ"*5に紐付く処理」だと考えているから。

なんだけど、そこで終わるようならわざわざこんな文章は書かない訳で、そのあたりから詳しく。

初手に気づいたのはLaravelが「Controllerに入ってくる前にvalidateを片付けておく( https://readouble.com/laravel/5.5/ja/validation.html )」って思想を見て*6……「あぁそういえばこーゆー思考、以前にも見たなぁ」と思いまして。
その後、CodeIgniter 3でもやはり、validatinoは「form validation( https://codeigniter.jp/user_guide/3/libraries/form_validation.html )」という名前で、controllerに紐付いていて。
ちぃと興味がわいたんで、あちこち、調べてみました。

CakePHP3。
https://book.cakephp.org/3.0/ja/core-libraries/validation.html
Validatorクラスが完全に独立していて、Controllerに書いてもModelに書いても「どちらでもどんぞ」的に見えます。

FuelPHP
http://fuelphp.jp/docs/1.8/classes/validation/validation.html
CakePHP3と同様「Validationが独立」しているので以下略

Symfony
https://symfony.com/doc/current/validation.html
どうも2種類あるっぽいですが、「The Basics of Validation」がEntity(Model)に書くような書き方であることから、「どちらかというとModelに書いて欲しい」雰囲気である事を想起させます。

Zend Framework
https://docs.zendframework.com/zend-validator/
今ひとつつかめないのですが、Validatorクラスが独立しているので以下略、と思われます。

Phalcon
https://phalcon-docs-ja.readthedocs.io/ja/stable/reference/validation.html
Validationクラスが独立しているので以下略。
………ところで、今、Phalconってどれくらい使われてるんですかねぇ?

Slim
http://www.slimframework.com/docs/
そもそも色々と「シンプル」なフレームワークなので、Validationも「自分で実装しましょう」(笑
なので、URIも「ドキュメントのTop」ですvalidateを書いてあるPageじゃないです(笑

さて。
大雑把にまとめますと
・Controller:2
・どちらかというとModel:1
・どっちでも:3
こんな感じですかねぇ。
いやまぁ別に「多数決でナニカを決めたい」わけではないのですが、とりあえず実態くらいは把握しておきましょう、と。

んで。
たまたま別件で知って、いやまぁ色々と思うところも多々あるフレームワークではあるのですが。
他言語になりますが、RoR(Ruby on Rails)において、いわゆるModelに近しい位置にいるActive Recordが https://railsguides.jp/active_record_validations.html で、こんな記述がありました。

データをデータベースに保存する前にバリデーションを実行する方法は、他にもデータベースネイティブの制約機能、クライアント側でのバリデーション、コントローラレベルのバリデーションなど、さまざまです。それぞれのメリットとデメリットは以下のとおりです。

・「データベース制約」や「ストアドプロシージャ」を使うと、バリデーションのメカニズムがデータベースに依存してしまい、テストや保守がその分面倒になります。ただし、データベースが (Rails以外の) 他のアプリケーションからも使われるのであれば、データベースレベルである程度のバリデーションを行なっておくのはよい方法です。また、データベースレベルのバリデーションの中には、使用頻度がきわめて高いテーブルの一意性バリデーションなど、他の方法では実装が困難なものもあります。
・「クライアント側でのバリデーション」は扱いやすく便利ですが、一般に単独では信頼性が不足します。JavaScriptを使ってバリデーションを実装する場合、ユーザーがJavaScriptをオフにしてしまえばバイパスされてしまいます。ただし、他の方法と併用するのであれば、クライアント側でのバリデーションはユーザーに即座にフィードバックを返すための便利な方法となるでしょう。
・「コントローラレベルのバリデーション」は一度はやってみたくなるものですが、たいてい手に負えなくなり、テストも保守も困難になりがちです。アプリケーションの寿命を永らえ、保守作業を苦痛なものにしないようにするためには、コントローラのコード量は可能な限り減らすべきです。

上で紹介したその他のバリデーションについては、特定の状況に応じて適宜追加してください。Railsチームは、ほとんどの場合モデルレベルのバリデーションが最も適切であると考えています。

このように書かれているのが、大変に興味深いかなぁ、と。
端的には「非常に近い見解を持っている」あたりで、興味がわきました。

さて。
ちぃと切り口を変えてみますと。
概ね「Controllerにvalidationを置きたい」というお話は「validationをformに紐付けたい」と考えているように見受けられ、同様に「Modelにvalidationを置きたい」というお話は「validationをテーブル(レコード)に紐付けたい」と考えているように見受けられます。

んで。
form側のお話がわからんでもなくて、つまり
・同じテーブルでも、formの入り口によって項目が違ったりする(常に全項目とは限らない)
などの揺れがあるので「formに紐付けたい」んじゃなかろうかなぁ、と。
あとはまぁ「エラーメッセージが出しやすい」って発想はありそうに思われるんですがね。

ただ、一方で
・同じテーブル/カラムにいれる情報なのに、入る口によって「文字だったり数字だったり」とか「最大長が100だったり200だったり」って変わるんだろうか?
って思うんですよねぇ。
「変わる」のであれば、確かにそれは「formに紐付けたほうがよい」かもしれないと思うのですが、おいちゃんが今まで経験している限りで「それを必須要件として持っている」案件って、出会った事がないんですよ。
少なくとも「同じ項目」であれば、そこのvalidateは基本「変わらない」。
せいぜいが「ここの入り口からだとこのカラムは変更禁止」てな感じくらいなので、ただ「変更禁止」は、validateではなく、別の責務なんじゃないか、って思うんですよねぇ。

そうすると。
個人的には
・「データ」を管理しているところでvalidationする
のが、一番「素直」なんじゃないかなぁ、と思うわけです。
なんか、カラムの追加があっても変更があっても「対象になるModelクラスを修正」すればよいだけ、なので、DRYになるじゃないですか。

で、次点としてどうしても(フレームワークとかの都合で)Controllerでせざるを得ないのであれば、せめて「そこに渡すルールは、Model側で管理して一意に管理」にしてはどうかなぁ? と。これならまぁDRYになる……かもしれない。「カラムの追加」とかがあるとDRYにはならなさそうな気もいっぱいしますが、まぁ「書き方次第」でもありましょうから、「ちゃんとDRYになるように書く」前提、って事で。

とはいえ一方で、寺子屋のメンバーから「Active Record(model)にあんまり責務が集中するのも如何なものだろう?」という議題提起をもらいまして、それはそれで興味深いところかなぁ、と。
おいちゃん個人としては「素直に考えた結果、どこかのクラス(の責務)が集中するのは、ある程度仕方がないんじゃないかなぁ」という雑な思想を持っているので(そのあたりは、 https://gallu.hatenadiary.jp/entry/2019/05/13/213612 でファットコントローラーへの言及で似たようなお話をしてます)、もうちょっと丁寧な議論を聞いてみたい気も満々でございます。

この辺は、なかなかに興味深いところかなぁ、と思われるのですが。
どこかで「アンサーブログ」とか、出てこないですかねぇ?w

*1:なので、万が一MagicWeaponを想定する場合、以下のModelはdata_clumpに相当します

*2:この辺、面白いっちゃぁ面白い所なので、要望があったら別途

*3:もちろん「ちゃんと動けばどこに書いたっていいじゃない」という主張がある事も存じ上げてはおりますが、個人的にはそういった御仁とは「適切な距離をおいて、穏便に恙なく平和裏に節度をもって形式上のお付き合いをしていきたいものだなぁ」と感じたりする所でございます

*4:ファイルだったりドキュメントだったりしてもよいんだけど

*5:もうちょっと端的には「1テーブル の 1レコード」

*6:5.5なのは「最近、お仕事で使ってたバージョン」だから。LTSだからってのもあります

お次はインフラ

インフラ系の入門を、いくつか。

小悪魔女子大生のサーバエンジニア日記 ――インターネットやサーバのしくみが楽しくわかる

小悪魔女子大生のサーバエンジニア日記 ――インターネットやサーバのしくみが楽しくわかる

全体を見たい場合に非常によい本かなぁ、と。
初学者向きでもありとても丁寧なのですが、イラストと手書き文字の賛否がわりとキッパリと二分しているので、その辺の好き嫌い次第、ってのは、多少。
ただ、とはいえ「書いてある内容を十全に把握していると言い切れる」初学者はあんまりいないと思うので、ちぃとくらいなら、苦手意識取っ払って読んでみてもよいと思う。

まぁ技術の世界はどこでもそうなのですが、インフラ系も「色々な用語」が飛び交います。
そんな用語をざっくりと幅広く解説してくれる書籍なので。
「通読」するのもよいですが「わからなくなったら開いてみる」のもよいかなぁ、と。
とはいえまぁ、一度は、脳内目次を作るために「通読」しておくと、効率がよいってぇもんです。

ピンクベースで可愛らしい感じの表紙の、とても「初心者フレンドリー」に"見える"本です。
基礎から丁寧に解説してくれる良書………なのですが、後半に、そのなだらかな雰囲気のまま「(C言語で)ネットワークプログラムを書いてみよう!」とか(笑
是非、雰囲気と流れにごまかされて、「これくらいは普通なのかなぁ?」って思いながら実習してみてくださいwww

Modelについて考えてみる

あちこちで「MVC」と言われつつ、なんか気がつくとMVPとかMVVMとか色々出てきて。
一方でじゃぁ「Model、って単語自体はは大体共通認識なのか?」と問うと、これがまた………。

というあたりで。
ちぃとごみごみと混雑しているように思われるので、一端、考察してみたいかなぁ、と。

以前に全く別の所でも書いたのですが。
大雑把に、フレームワーク(WAF)は
・ルーティングに従ってディスパッチして
ビジネスロジック呼んで処理して
・出力
ってな流れが、ものすごく大雑把なあたりで、主だった処理の流れだと思われまして。

んで、この「ビジネスロジック」の所が、実際には
・DBとやりとりをするところ
・データをごにょごにょする所
の2つがあると思うのですだす。

んで。
「Modelってなに?」って聞いたときに、確実に紛糾するのが、あるいは分離するのが、この聞き方。

・「Model ≒ ORM」は、true? false?

この判定式のboolean値によって、以降の内容が決まってくるわけでございます。
端的に「Modelの1インスタンスが、(大体)1テーブルの1レコードを意味している」のであれば、上述はtrueになる感じ。
とはいえ……昨今のフレームワークの多くは「true」なのではないかなぁ、と思うので、そのルートを前提に。

上述が概ねtrueだとすると、次の質問が

・「ビジネスロジック」は、どこに書くの?

というあたり。
これが「コントローラー」になるんなら、まぁ「トップハム・ハット卿*1になる」事は仕方が無いんじゃないかなぁ、と思うですよ基本的には。
勿論「ほかの場所に切り出してコントローラーをスリムにする」のはよいのですが、結局それって「コントローラーが抱え込む脂肪をほかのclassに押しつけている」だけ、なので、ほかのどこかがファットになるだけかなぁ、と。
で「んじゃぁ山盛りでclass作ってどこもスリムにする」と、今度はファイルの全体量とかクラスの数とかメソッドの数とかが半端なくなくなって可読性が落ちるので、個人的にはそっちの方が「よりお好まないかなぁ」と。
なので「必要な流れを必要な程度に書く」のは必要で、それが「特に分割するメリットがない」のであれば、ある程度長くなるのも、状況によっては「やむを得ない」と思うんですよ。

ただまぁ実際には「共通化」とか「テスタビリティ」とかの観点もあるかなぁ、と思うので。
「Model ≒ ORM」なのであれば、ビジネスロジックは「どこかにそれようのディレクトリとか名前空間とか掘って、そこに入れる」とよいんじゃないかなぁ、と。
おいちゃんは「Libs」とかよく使います。

つまり
・Contriollerは、基本的には「Libs」を呼ぶ
・Libsの中で、必要なテーブルに紐付いているModel(群)を呼ぶ
・「ORM使ったりSQL書いたり」は、Modelの中に閉じ込める
ってな感じ。

いやまぁ「ちょっとした処理くらいならControllerに直接書く」でもよいと思うのですが。
さじ加減が出来ない人がいると判断が面倒なので、その辺はチームメンバー(のレベル)とかコードレビューの文化の浸透具合とかと相談しつつ、適宜よしなに。

あと。
「Model ≒ ORM」の場合、Modelの1インスタンスは「1レコード」、1メソッドは「1レコードに対する処理」、1 staticメソッドは「1テーブルに対する処理」的に書いておくと、割と平和でございます。
まぁそうすると「JOINするようなモンはどこに書くのん?」ってなお話になるのですが、主従がはっきりしている関係であれば、主の側に書いておくと割と平和かなぁ、と。

んで。
「Model ≒ ORM がtrue」の時に「ビジネスロジックをModelに実装する」のは、思いっきりお勧めしません。
端的に、例えば「2つとか3つのテーブルを横断的に使うビジネスロジック」があったとして、それ、どのクラスに実装します? ってなお話になるので。
勿論「無理くり実装」は出来ますが、お勧めは、全くできないかなぁ、と思われます。

次。
「Model ≠ ORM」ってフレームワークは、あんまりないと思うのですが*2
その場合は「ビジネスロジックをModelに書く」のがコレクトかと思われまして、どちらかというと「んじゃ、データを扱うORM的な立ち位置をどうするの?」ってなお話になって、それを「Modelとは別のクラスに書いた方がいいんじゃね?」とかいうお話になります*3

あと。ORM自体については https://gallu.hatenadiary.jp/entry/2019/05/08/001034 で書いたので省略(っつかこのために書いたんだしw)。

最後に。
時々「ModelがただのSQL置き場になっている」ような実装を見かけまして、個人的には「一番お好まない」かなぁ、と。
本質的には「Modelの1インスタンスは"何を"表してますか?」ってな質問に、20文字以内で帰ってこないんなら「そのクラス設計、間違えてない?」ってとりあえず質問をしたくなる。
あと、基本的には
・ModelでSQL発行している(Model ≒ ORM)んなら、Modelの1インスタンスは「1レコード」であって欲しい
・基本的なSQLくらいは「基底クラスでメソッドが用意されていて、簡単に1行で記述できる」くらいの実装は欲しい
・「「Model ≠ ORM」なら、そもそも「ModelでSQL発行すんな」って思う
ってのがあるかなぁ、と。

おまけ。
・1つのModelクラスで、全然関係ないいろいろなテーブルへのSQLを渾然一体に発行している
のを見た事が数度ありまして、アレについては、殺意しか覚えませんでしたねぇ(苦笑
なので、番外。

ってなわけで。
いやまぁ「どんな実装しようが個人の自由だよねぇ」は勿論あるのですが。
とはいえ現実的に「メンテが厄介な実装」ってのは「後で、他人様の足を引っ張る」ので、おいちゃんとしては大変に「お好まない」かなぁ、と。

その辺を考えた時に、例えばModelであれば「Modelとはなんなのか? なにを書いて、なにを"書かない*4"クラスなのか?」ってのくらいは、現場毎に違って良いので、せめて「クリアな回答が欲しい」なぁ、とか思うですだす。

んでまぁその一方で「このフレームワークだから、ベースはこんな感じだよねぇ」ってのはあると思うので。
だとするとせめて「ビジネスロジックとORMが渾然一体と混ざり合った「もったりとしてコクがなく*5」な状態のクラスにならなきゃいいなぁ、とか、思ってみたりするです。

*1:「テレビシリーズでの英国版では原作と同様、基本的に「Fat Controller」と呼ばれる」……説明が必要なネタをやるな

*2:MagicWeaponが ≠ でございますちなみに

*3:MagicWeaponだと、data_clumpというクラスが「別のクラス」に相当します

*4:ここ大事

*5: (C)スレイヤーズ

ORMについて考えてみる

ORMで初っぱなボケようとして割とよい感じの「別の意味」が見つからなくてもんどり打ってるおいちゃんでございます*1
まぁボケっぱなしだと話が続かないので、速やかに本題に。

Object-relational mapping、でございます。O/RMって書かれたりORMって書かれたり。
ここでは面倒なんでORMで。

そのORMですが。
評価については、「まんせー」から「Go to Hell」まで、割と激しい幅がある技術なんじゃないかなぁ? とか思ったりするんですがいかがでしょうか?
実は、後ほど「ORMに言及する」別のBlogを書こうとしているので、「現時点での」おいちゃんの見解を書いておきたいなぁ、と。

おいちゃんの見解としては
・軽いものはORMで書くけどやっかいなやつはSQLダイレクトに書いたほうが早い事が多いよねぇ
ってのをベースに
・チーム内に「ORMに長けたメンバーがいて厄介な質問でも回答が帰ってくる」んならORM側に寄せますがそうでなければSQL側に寄せます
って感じかなぁ、と。

んで。
おいちゃんが知っている限り。
……いやまぁ「不勉強で触った事もなくてなんとなく新しい技術は毛嫌いしているからORMヤダ」って人がいないわけではないのですが。
どちらかというと「実際に使ってみて(使いこなしたとは言っていない)、一定量のトラブル経験を経て嫌になった」人のほうが、割合的には多いんじゃないかなぁ? と。

んで。
「一定量のトラブル」については
・そもそもORMという思想では根本的に解決不能な問題(あるのかどうかは知らない:可能性として)
・ORMの実装的に根本的に解決不能な問題(あるのかどうかは知らない:可能性として:これはありそうだなぁ)
・ORMで解決できなくもないが、トリッキーだったり特殊なやり方が必要だったいする(近しいのは見た事があるなぁ)
・ORMで一応解決可能だが、実装が複雑だったり難しかったり知られてなかったり
あたりが割とあるんじゃないかなぁ? とか思ったりするです。

特に後半2つが割と厄介で。
「チーム内にORMに長けたメンバーがいて厄介な質問でも回答が帰ってくる」んならある程度許容範囲かもしれないのですが、「ORMに長けたメンバーがいなくて、ちょいちょいと調べ物が発生したり、ORM自体のソースコードに潜ったりする必要がある」とかって感じになってくると、途端にストレスの上昇カーブが激しくなってくるかなぁ、と。
さりとて、そのORMに深い思い入れがあるわけでなければ「ものすごいコストをかけてそのORMの微に入り細を穿つところまで習得する必要は、あるの?」とかいう疑問が横切った瞬間に「生SQLでよくね?」的なチョイスに向かう事も、少なくないのではなかろうか、と。

んで。
よくORMの例題に出てくるような「シンプルで単純なSQL」なら、そりゃORMのほうが楽でしょうて。
ただ、そういった「シンプルで単純なSQL」以外が、業務では、出てくる可能性が0ではなくて*2
その辺を「どうするか?」ってあたりへの回答が
・無理
・トリッキーなやり方で出来る
・出来るけど情報を探すまでが少し厄介
・普通に出来る
ってあたりで色々グラデーションがあるんじゃないかなぁ? と。

例えばよく言われるあたりが「N+1問題」。
ただまぁ、それ以外にも「なんでこんな変なわかりにくいコードかかないかんねんこれならSQL書いたほうが早いじゃん」的な、etc etc。

その辺を考えると、 https://www.kaitoy.xyz/2015/09/13/orm-is-offensive-anti-pattern/ あたりも、一笑に付す事が、幾分、難しい側面もあるんじゃないかなぁ、とか。

んで。
ちぃと興味深いBlogを見つけたので、少し言及してみたく。
https://qiita.com/niisan-tokyo/items/156eb35c6eeaf07b9b65

1. SQLを書かなくていい!

これが「利点になるかどうか」は、「やりたい事を、SQLとORMのコードで書いて比較」次第なんじゃないかなぁ? とか思ったり。

そこを前提に。

1.1 SQLという「別言語」を混在させずに済む

それをいうと、PHPを書いててもHTMLだのJavaScriptだのと「完全に無縁」とはなかなかいかないような気もしますし。

あと、個人的な所感ですが、SQLの直書きが許されている場合、似たようなSQLが量産される傾向にあるように思います。

については「環境が悪いだけじゃないかなぁ?」とか思うわけです。
あるいは「ORMになったからといって、似たようなコードが量産されないのか?」という疑問があったり。

1.2 「よい」SQLを作ってくれる

「ナニをもってよいとしているんだろう?」と思ったのですが、

これはSQLインジェクションに対する対処としては定石となる手法ですが、手で書こうとすると割と面倒だったりします。

えぇ………… orz
それは、ないと思うなぁ。

2. ゲッター・セッターの仕組みを利用できる

これは別にORM使わなくても出来る。

3. 所有関係を定義できる

「JOIN使えばいいじゃない」と言うべきなのか「FOREIGN KEY使おうよ」と言うべきなのか。

んで。

1.1 SQLを書かない
中略
SQLをバリバリ書ける人にとっては、SQLが勝手に生成されるORMは自由度がないと思うかもしれません。

まぁ、ここだよねぇ、的な。
んなにバリバリ書けるわけではないのですが、それでも割とちょいちょいと「縛りがきついんじゃ*3」と思う瞬間は、割とちょいちょい。

1.2 JOINを使わないかもしれない

……これは「ない」と信じたいなぁ……知らんが。
ちなもし「JOINを使ってない」場合、

これが絶対に悪いかというと、実はそうとも言い切れません。

と書かれてますが、基本的に「がっつりと悪い」です。

2. 嫌ってる人がいる

「なんで嫌ってるのか?」次第だよねぇ、と。

3. N+1問題

言わずもがな。

と言うわけで。

エンジニアにとって、コード量を少なく可読性をよくできることが、ソフトウェアの品質を上げる有効な手段でありますので、ORMで品質が良くなるのであれば、ガンガン導入していきたいです。

については「品質が良くなるのであれば」使う事に抵抗感はないのですが。
「縛りの結果、変な箇所が生まれる」のであれば、その部分の品質が低下してしまうので、そういった部分にまで「むりくりにORM縛りをする」のは、あんまり好まないかなぁ、と。

んで「むしろ、SQLを書いちゃうと、オブジェクト化ができなかったりします。」でデメリットが出るのであれば、選択肢としてはどちらかというと「んじゃ、ORM使わないほうが効率よくない?」って判断になり得るんじゃないかなぁ? とか思う訳です。


あと、もう1つ興味深い、こちらはスライドを。
https://www.slideshare.net/kwatch/how-topreventorm-troubles

しかし ORM は、アプリケーション開発者にとっては便利でも

わりとそうでもない(苦笑

ORMによるトラブルは (たいてい) 解決策がある

「たいてい」ってあたりに、色々と味わいを感じてしまいます(苦笑

なんてちょっと軽いところに茶々を入れながら。

背景:ORMによるトラブルが多発
ORMが生成するSQLがクソ いわゆる「ぐるぐる系SQL
SQLをろくに勉強しないアプリ開発者 そのくせOOPデザインパターンを得意げに語る ;(
開発効率を上げるためのORMなのに話が違う! ある面では効率が上がっても、別の問題を引き起こしている

この辺、色々と闇の深さを感じます………

DBAがORMを知らなすぎる

この辺は「ど~なんだろうなぁ?」的な。
おいちゃんが「(DBAではなく)プログラマ」だから、「ORMはプログラマが把握してDBAに説明すべきもの」なんじゃないかなぁ? って思ってしまうので、「DBAがORMを知らないのはヨクナイ!!」とは、あんまり、考えたことがないかも。

んでまぁ……理想が「アプリ開発者がSQLを勉強してくれる」になっているあたり、が、なんとも(苦笑
いや大事だと思うんですよSQL理解するのは。
ただ、この発言の背景にある「アプリ開発者のSQLの不勉強っぷり」に思いを馳せると、色々と、ねぇ………

Prepared Statementではwhere句への追加 などが行えない

については、ここで書いてあるテンプレートやクエリオブジェクトを使う以外にも、割と色々と手段があるので、ぶっちゃけ「困ったことはない」ですねぇ。

ORMでよくあるトラブル

「クエリ発行箇所が特定できない」は、言われてみれば確かに、ですねぇ。
index付け忘れとかは、論外付近の事象ではなかろうか、と。

開発者からのSQLの相談に乗ってあげる

相談に乗って貰えるんなら、是が非でも、是非とも……

心構えその5:金を積む

大爆笑www
でもまぁ「真理でございます」w

あと。

個人的にお勧めなO/Rマッパーは? ?

のところで

自作!自作マジお勧め! 職人が自分の道具作って何が悪い!車輪の再発明なぞ知らんがな!

とかあるのは、心から爆笑するとともに、深くうなずける一文でございます。

ActiveRecord?あれはあんまり…

そなの?
この辺はよくしらない。

あと、地味に「PHPでお勧めのORMが出てない」のが、なんとも………。


とまぁ、ざっくりまとめると。
おいちゃんの見解としては
・軽いものはORMで書くけどやっかいなやつはSQLダイレクトに書いたほうが早い事が多いよねぇ
ってのをベースに
・チーム内に「ORMに長けたメンバーがいて厄介な質問でも回答が帰ってくる」んならORM側に寄せますがそうでなければSQL側に寄せます
って感じかなぁ、と。

もうちょっと、ORMの裏側の仕組み&コードの書き方がこなれてきたら、もうちょっと印象が変わるような気がするんですけどねぇ。
現状だと「全部ORMのみで、SQLは一切書かない」は、案件にもよるんだけど、ちょっと選択肢としては「難しい事が多い」かなぁ、と。

ただまぁ、つまり「生SQLも比較的容易に飲み込める」タイプのORMであれば、「シンプルなSQLはORMのほうが手っ取り早い」のも事実なので、割と積極的に使いたいところではあるんですよねぇ。
なので、別に「ORM死すべし」とは思ってないあたりが、とてもどっちつかずだなぁ、と(笑

*1:マテ

*2:つまり「一定量存在する」

*3: (C)千鳥 ノブ

プログラムを学ぶための本といえば

どっちも、まだ「プログラムを始めた頃」だと少し難しかったり不思議だったりする内容なのかもしれないんだけど。
とはいえ、一端は頭の中に「なんとなく」でもいいから、インストールしておいたほうがよいんじゃないかなぁ、と思う書籍を2つ。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード、は、結局のところ「保守メンテがしやすいコードの書き方」なので、早めのタイミングでお作法として理解していたほうが、色々と(内外に)トラブルを抑止できます。
コーディングを支える技術、は、言語を「少し俯瞰して」見る事ができるので、プログラマを己の飯の種の1つにするのであれば、読んでいて損のない1冊です。

リーダブルコードは、近い書籍がほかにも数冊出ているので、そういった書籍も一緒に読んでみてもよいんじゃないかなぁ、と思います。

Slimは本当にスリムなのだろうか?

ちょいと気になったり興味があったりしたので、いくつかの「比較的(日本で)ポピュラーと思われる」PHP Web Application Framerowkの、行数とかファイル数とかを調べてみました。
まずインストールですが、本日のタイミングで

composer.phar create-project laravel/laravel laravel
composer.phar create-project cakephp/app cakephp
composer.phar create-project symfony/framework-standard-edition symfony
composer.phar create-project kenjis/codeigniter-composer-installer codeigniter
composer.phar create-project slim/slim-skeleton slim

という感じで一通り入れています。
バージョンとかの細かい違いがあると思うので、その辺は適宜脳内補完をお願いいたします。

また、ファイル数や行数は、基本的には以下のように調べています。

#
find vendor/ -name "*.php" | xargs  wc -l | tail -n 1
find vendor/ -name "*.php" -type f | wc -l
#
find FW本体と思われるディレクトリ -name "*.php" | xargs wc -l | tail -n 1
find FW本体と思われるディレクトリ -name "*.php" -type f | wc -l

ただ、上述だと「ファイル数が多くてうまく合計されない」ものもあるので、その辺は適宜よしなにしております*1

結果。

フレームワーク 全体ファイル数 全体行数 FW本体と思われるディレクト FWファイル数 FW行数
laravel 6161 832270 vendor/laravel/framework/ 857 127125
symfony 6134 739122 vendor/symfony/symfony/ 4055 466309
cakephp 4469 598447 vendor/cakephp/ 872 135415
codeigniter 258 78948 vendor/codeigniter/framework/ 199 68492
slim 1424 145223 vendor/slim/slim/ 47 8564

Laravelが重量級なのは想像通り、cakephpもそれなりに。
symfonyが、思いのほか「フレームワーク本体(と思われる……もしかしたら本体以外が混ざってるのかも)」のファイル数&行数が膨大で、ちょいとびっくり。
codeigniterは「全体としては軽い」んだけど「本体はそこそこの重量」があって。
slimは、「周辺まで含む」と少し行数ファイル数ともあるものの、本体はさすがに貫禄の軽量っぷりw

こうやって見ると、改めて「フレームワーク"を"読む」なら、Slimから、ってのは、割と入門的な位置に行けそうだなぁ、と、改めて感じるところでございます。

*1:findをリダイレクトして「行頭に wc -l」の置換かましたのを実行した結果をリダイレクトたものの0x20をタブに置換してExcelでsum w

この本は外せない

何はなくとも、レベルで必読な書籍

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

書いてある内容は割と平坦で「技術素養が薄くても普通に読める」んだけど、そこにあるエッセンスは「業務を二桁年重ねてきたエンジニアでさえも割と失念しがち」な、本当に大事なことが色々と書かれていると思う。