オブジェクト指向システムの設計 174 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/09/26(火) 07:20:38.98ID:qu+DPehL
前スレ
オブジェクト指向システムの設計 172
http://mevius.2ch.net/test/read.cgi/tech/1467992113
オブジェクト指向システムの設計 173
http://mevius.2ch.net/test/read.cgi/tech/1502182334/

類似スレ
手続き型システムの設計 1
http://mevius.2ch.net/test/read.cgi/tech/1500282714
2017/10/13(金) 23:14:22.48ID:s0+Jkp8l
>>487
バリデーションとメッセージとUIを一緒くたにするな
どこが保守性高いんだか、見づらいだけだろ
2017/10/13(金) 23:14:50.38ID:+zTlsJiZ
>>487
それは普通に抽象化できるだろ
そんなん100個も繰り封ヤしてたらサブャCボ出るわ
2017/10/13(金) 23:16:05.73ID:+zTlsJiZ
だよなー
判定と表示は分けようって最初に教わる
2017/10/13(金) 23:18:48.84ID:s0+Jkp8l
バリデーションはYAMLで定義するのが一番だって最近気づいた
2017/10/13(金) 23:31:13.18ID:6pOkahl4
御託はいいからコード書いてみれば?
俺のコードより明確で保守性の高いコードをかけるとは思えんが
2017/10/13(金) 23:36:42.10ID:pm2E02lv
こーゆー上から目線なやつは自分の思い描くもの以外は全部クソって発想なのでめんどくさい
2017/10/13(金) 23:38:06.15ID:6pOkahl4
そもそも俺のコードは判定と表示が綺麗に分かれてるし
2017/10/14(土) 00:25:45.56ID:2Glba8SI
煽って教えてもらうスタイルに転向した?
2017/10/14(土) 00:53:07.58ID:T9MbLxY+
きも
2017/10/14(土) 07:25:19.71ID:SVCVJk+z
バリデーション処理はexcel表から生成するものだよ
素人は手書きするらしいけどね
プロはこんなめんどくさいコードは書かない
2017/10/14(土) 09:45:45.21ID:xbyIhqN5
>>497
マジで!?どういう仕組み?
2017/10/14(土) 10:58:40.12ID:SVCVJk+z
>>498
簡単だよ
|画面ID|セレクタ|コマンド名|ルール|
の一覧表をVBAマクロのループで回してjavascriptのコードを生成してjsフォルダに置く
それだけだ
うちの会社では20画面程度のシステムを扱うことが多いけど、このマクロのおかげで全画面の検証処理の実装が1人日でできてしまう
一覧性も高くそのまま仕様書やテストケースにも使える優れものだ
2017/10/14(土) 11:22:11.10ID:K4XROtS+
コピペプログラマは余計なコードを増やしてくれるな

foreach(validate as entry){
if (!validateRequired(entry.name)) {
var msgFormat = getResource(entry.resource);
var label = getLabel(entry.name);
addMessage(msgFormat, label);
addCss(entry.name, entry.clazz);
}
}

簡単に100分の1になるだろ
validateもプログラムからデータにしたら保守性あがるだろ
Modelからvalidateを収集するようにしてビジネスロジックを集約してもいいけど
今更そこまで設計変えるのは愚策か
2017/10/14(土) 11:32:55.38ID:SVCVJk+z
>>500
これじゃ何やってるかお客様がわからないだろ
素直にエクセルにしろって
2017/10/14(土) 11:44:12.14ID:XRdStdss
お客様がソース読むのかよ w
条件をお客様が決めるならExcelでもらって>>500のentryを生成するツールを作ればいいだけ
2017/10/14(土) 11:47:29.29ID:SVCVJk+z
結局コード生成するんじゃないかwww
なら最初からコード生成する前提で余計な手書きコードは書かない方がいい
プログラミングの基本すらわかってないのかよ
2017/10/14(土) 12:02:38.48ID:2Glba8SI
でた、いつもの自称プロさんw
2017/10/14(土) 12:08:57.88ID:SVCVJk+z
自称プロってwww
ここは学生専用だったか?
2017/10/14(土) 12:51:39.31ID:6KISst0f
>>502
> 条件をお客様が決めるならExcelでもらって>>500のentryを生成するツールを作ればいいだけ

発想が逆。YAML形式などで条件を書いて
必要ならばExcelに変換する。
Excelなんてサイズが無駄に多すぎて差分の比較もできないから
バージョン管理は事実上無理だろ
2017/10/14(土) 12:56:11.86ID:6KISst0f
YAML形式の何が良いかというとシンプルで見やすいから
お客様が直接読み書きできるってことだな
下手なCSVファイルよりもメンテナンス性が良い
2017/10/14(土) 13:15:41.53ID:NTbBehto
まあそのデータなら差分出したきゃ
CSVで出して比較できそうだけどな
2017/10/14(土) 13:55:47.42ID:2Glba8SI
Excelでも管理できてるなら別にいいと思うぞ
客や開発メンバーのリテラシーレベルに合ってるなら
無理に違うフォーマットを強要する必要はない
openxmlとか使えば差分比較だけならできる

むしろルールと処理を密結合させても平気な神経のほうが理解できない
そのうえプロを自称してドヤるww
2017/10/14(土) 14:10:09.58ID:6KISst0f
>>509
客にExcelを "ルール通りに" 使わせるという
リテラシーレベルをもとめるな

勝手にフォーマットを変える、勝手にセルを結合する。
どこからかコピペした結果おかしくなって直さない
追加分とかいって差分を送りました。そっちで結合してください
とか、毎回人手で対応しなきゃならない作業が発生するぞ。
こっちで決めた使い方のルールを守ってくれやしない
2017/10/14(土) 14:11:17.22ID:6KISst0f
> openxmlとか使えば差分比較だけならできる
むり、見た目同じように見えても、
レイアウト属性など関係ない情報の
大量の差分までできて管理できない
2017/10/14(土) 14:12:50.65ID:2Glba8SI
>>511
属性情報は無視してdiff出せるよ
色変えたとか罫線追加したとかそのレベルの差分確認したいとなると
専用ツール入れないと実用レベルでは使えない
2017/10/14(土) 14:15:37.80ID:NZcmE+Ju
ヴァリデーションフレームワークってどれも中途半端だよな
ちょっと複雑なヴァリデーションをしようとすると適用不能になる
しょうがないからカスタムコードを書くことになるんだけどフレームワークとケンカし始めるからフレームワークは規約で禁止って流れになる
日本の厳しい要件についてこれる柔軟性の高いフレームワークは無いものか
2017/10/14(土) 14:16:08.20ID:2Glba8SI
>>510
その辺は上の自称プロさんならVBA使ってルール守らせるExcel作るだろ
俺は別にExcel推奨したいわけじゃないぞ
2017/10/14(土) 14:16:14.83ID:XRdStdss
>>506
意味わからん
YAMLで書ける客がどれだけいるんだよ w
そもそも客がYAMLで書けるならExcelに変換なんて要らん、そのままソースに変換するなりすればいい
要件によっては実行時にそのまま読み込んでもいいかも知れんし
まあ>>500程度ならcsvとかで充分だと思うが
2017/10/14(土) 14:18:15.77ID:XRdStdss
>>510
> とか、毎回人手で対応しなきゃならない作業が発生するぞ。
どんだけ低レベルの客と付き合ってるんだよ w
2017/10/14(土) 14:22:34.78ID:6KISst0f
>>512
例えばこの例だと行を一行追加して、A2にあったWorldが
A3に変わった時の差分はこんなふうに表示される
http://blog.modd.com/entry/2016/01/26/125206

diff -u a.txt b.txt
--- a.txt 2017-10-14 14:16:59.481494825 +0900
+++ b.txt 2017-10-14 14:17:20.601528128 +0900
@@ -5,6 +5,12 @@
</row>
<row r="2">
<c r="A2" t="str">
+ <v>OOXML</v>
+ </c>
+</row>
+<row r="3">
+ <c r="A3" t="str">
<v>World</v>
</c>
</row>

Worldがもともとrow r="2"、c r="A3" だったわけだが、たった一行挿入することで、
2行目以下の、"全ての行データに対して" このようにrowとcが変化するわけだよ。
それで差分を管理できるわけ無いだろ。
2017/10/14(土) 14:24:44.57ID:6KISst0f
>>515
> YAMLで書ける客がどれだけいるんだよ w

こっちでこんな感じで書いてくださいっていうだけ。
それはExcelと同じ。

違うのは、Excelでは条件を指定した所で
見えない情報(フォーマット情報など)が
大量に埋め込まれるということ。
そしてその見えない情報を正しく修正するのが大変だということ
2017/10/14(土) 14:26:09.55ID:6KISst0f
>>516
> どんだけ低レベルの客と付き合ってるんだよ w

逆。客のレベルがExcelを無駄に使えるから
セルの結合とか色を変えたりしてくる。
Excelはできることが多すぎるんだよ。
余計なことをなんでもできてしまう。
2017/10/14(土) 14:28:15.75ID:6KISst0f
>>513
> ちょっと複雑なヴァリデーションをしようとすると適用不能になる

普通はちょっと複雑なバリデーションを書くための方法がフレームワークに用意されてる。

それに、ちょっと複雑なところだけ別にやればいいだけ。

100個のうち1個のマイナーケースに対応できないから、
100個すべてめんどくさい方法で作りましたとかアホでしか無い。
2017/10/14(土) 14:30:01.79ID:NZcmE+Ju
>>520
日本の業務アプリを甘く見過ぎだろ
カスタムコード書きまくらないと対応できねえよ
アホみたいにシンプルなUIしか書かなくてもいいWeb屋はスキル要らないし気楽でいいよな
2017/10/14(土) 14:34:03.24ID:6KISst0f
>>521
じゃあバリデーションのすべてがカスタムコードである例を教えてください
2017/10/14(土) 14:35:49.60ID:6KISst0f
例えば郵便番号のバリデーションが
カスタムコードとか言いそうで笑えるw

そして郵便番号を使うたびに
同じバリデーションをコピペしてるんだろうな。

普通は関数にしてフレームワークに登録すれば終わり
あとは同じバリデーションを使いまわしできる。
2017/10/14(土) 14:40:00.04ID:6KISst0f
あぁ、当たり前だけど範囲チェックや型チェックや正規表現チェックとか
単純なものだけではなく、カスタムバリデーションや条件付きバリデーションなんかも
フレームワークの基本機能の1つだと先に言っておこう
2017/10/14(土) 14:45:10.18ID:XRdStdss
>>518-519
> こっちでこんな感じで書いてくださいっていうだけ。
えっ?
YAMLの書き方から教えるのかよ...
Excelでフォーマット守れって言うこともできない客にYAML書けるとか無職の妄想乙 w
2017/10/14(土) 14:46:32.49ID:6KISst0f
日本の業務アプリを作っているところがアホなのは、
バリデーションが正しく機能しているかは
アプリを実行して画面からぽちぽち実際と同じ使い方をして
検証していることなんだよな。同じ内容のバリデーションであっても
項目ごとに検証する。それがテスト時間を無意味に増やしてしまっている。

本来はバリデーションのテストは種類ごとに1つ(すごく当たり前だがw)
そして、画面の項目ごとに、想定しているバリデーション名が
設定されているかを設定ファイルを見て確認するだけ。
実際に動かしてテストはしない。
2017/10/14(土) 14:47:12.46ID:2Glba8SI
>>517
試したけど俺の環境では↓こうなるよ
diffだけなら十分実用レベル

$git diff
diff --git a/book.xlsx b/book.xlsx
index c75fc9a..6215aa2 100644
--- a/book.xlsx
+++ b/book.xlsx
@@ -1,5 +1,6 @@
Sheet1
Hello
+ OOXML
World
2017/10/14(土) 14:50:00.76ID:6KISst0f
>>525
> YAMLの書き方から教えるのかよ...

YAMLの書き方はExcelよりも簡単だよ。
Excelは知らない人が使いこなすためには
数週間とか数カ月かかるが、

YAMLだとフォーマット用意して、
これと同じように書いてくださいで説明終わり。

Excelでフォーマットを守れないのは、
これと同じように書いてくださいと言っても、使い方が難しいから。
俺の母親は、文字の自動補間機能のせいで「1」と入力しようと
しても「10」と補完されてしまって困っていたな。
2017/10/14(土) 14:52:49.20ID:2Glba8SI
>>527
実際のイメージ
https://i.imgur.com/uatG5Vj.png
2017/10/14(土) 14:53:33.13ID:6KISst0f
>>527
じゃあ今度はある程度データを入れて、同じ内容のセルを結合する前後で
ためしてみそれがどう見えるかを確認したら絶望することになるから
2017/10/14(土) 14:56:35.11ID:6KISst0f
ちなみに補足しておくと、>>529はxlsxを直接比較しているのではなく
xlsxをテキストに変換してから比較している。
その時にフォーマット情報などいろいろ抜け落ちる。

だから「取り消し線のところは無視してください。」なんてのはわからない。
このようにExcelはなんでもできてしまうから、
重要な情報が抜け落ちる所に書かれてあった時に比較できない。
2017/10/14(土) 15:07:27.23ID:XRdStdss
>>528
Excelの使い方が難しい?
YAMLがきちんと書けてExcel使えない奴なんて見たことないけどな
お前のおかんはYAML書けるのか? w
2017/10/14(土) 15:08:18.32ID:NTbBehto
>>526
俺はやるべきだと思うなぁ
だって外人のアプリってそのせいなのかどうなのか知らんけど
よく動いてないじゃんw
2017/10/14(土) 15:08:49.27ID:XRdStdss
>>531
>>500にはフォーマット情報なんて要らんだろ
どんどん深みにはまってるぞ w
2017/10/14(土) 15:10:17.11ID:NTbBehto
xmlはプログラマしか編集できない上に
ファイルがでかくなると読み込み速度ヤバイので駄目だよ
2017/10/14(土) 15:20:54.33ID:IPoqHaAU
俺が昨日書いた検証処理の一部
実際にはこれの数十倍の検証ルールがあると考えてほしい
フレームワークで簡単にできるなら教えてほしいおねがいします

webアプリ
テーブルをバリデーションする

列は4つでそれぞれinputを持ってる
typeは順に「checkbox, text, text, text」

検索でバックエンドから取ってきたデータがこのテーブルに表示される
これを手入力で編集してバックエンドに保存する
再検索できるが検索時にはバリデーションしなくてよい
保存するときはバリデーションを実行する

メッセージはローカライズすること
すべてのテキストリソースはバックエンドで管理されている
2017/10/14(土) 15:21:29.07ID:IPoqHaAU
1列目のcheckboxがOFFの行はバリデーションしなくていい
2〜4列目のtextがすべて未入力の行はバリデーションしなくていい

2, 3列目が空白の場合エラー
2, 3列目が整数でない場合エラー
2, 3列目の合計値が1000を超えたらエラー

1列目のcheckboxがONの行の2, 3列目の合計値が10000を超えたらエラー

4列目はオプション
10文字以上の場合エラー
入力された文字列がバックエンドに登録されていない場合エラー

エラーメッセージは重複を排除して昇順に並び替えて所定の ul の子要素として追加する

エラーがあった入力項目は背景色を赤くする
同じ行で1つでもエラーがあった行は罫線を赤くする
2017/10/14(土) 15:22:07.10ID:6KISst0f
>>533
> だって外人のアプリってそのせいなのかどうなのか知らんけど
> よく動いてないじゃんw

外人のアプリって何?Windows?Linux?MacOS?
2017/10/14(土) 15:42:07.29ID:D5wME4oE
OSをアプリって言う奴初めて見たw
2017/10/14(土) 15:51:27.37ID:6KISst0f
>>537
どうでもいいけど、列目〜とか言って時点で、画面と密結合してんなーとしか思えんなw

列があれば行もあるんだろうけど、一行単位で処理してるようだから、
一行が、一クラスの一インスタンスと考えればよいだろう
1000超えたらエラーなのか10000超えたらエラーなのか分からんが。

画面表示周りにビューの仕事でこれはバリデーションではない。
バリデーション結果オブジェクトを見てビューで表示さればいいだけ(何度も言わせないように)

長くなったのでコードは次のレスに書く
2017/10/14(土) 15:51:34.74ID:6KISst0f
class Row
 include ActiveModel::Validations

 def col1_condition; end
 def col2_value; end
 def col3_value; end
 def col4_text; end

 def condition;
  col1_condition && col2_value.present? && col3_value.present? && col4_text.present?
 end
 def col2_plus_col3_number
  col2_value + col3_value
 end
 // ↑ここまでは単なるクラス定義
 //↓ここ以下がバリデーション

 validates :col2_value numericality: true, presence: true, if condition
 validates :col3_value numericality: true, presence: true, if condition
 validates :col2_plus_col3_number less_than_or_equal_to: 1000, if condition
 validates :col2_plus_col3_number less_than_or_equal_to: 10000, if condition

 validates :col4_text; maximun: 10, if condition
 validate :col4_registered

 def col4_registered
  // 入力された文字列がバックエンドに登録されていない場合エラー
 end
end
2017/10/14(土) 15:53:04.43ID:6KISst0f
× validate :col4_registered
○ validate :col4_registered, if: condition

っていうか全部 if の後の: 付け忘れてたw
2017/10/14(土) 16:04:41.69ID:2Glba8SI
>>531
だからそれは意図して属性情報は差分比較しないようにしてるからじゃん。。
なんなんその言いがかり

セルの結合もデータ的に何を意味してるのかVBA使うやつなら当然知ってるし
データとして使うExcelシートなら書式設定は変更されないようにロックするだろ
その辺のリテラシがないならExcel使うってのは選択肢にはならないわな
2017/10/14(土) 16:09:11.95ID:6KISst0f
>>543
すべての属性情報が無視していいとは限らないからね。
属性情報として重要な事が書かれているかもしれない。
そういう無視して良いのがないかわからないのがExcelの欠点の1つ
Excelになれている人ほど、余計な工夫をしてくる。
2017/10/14(土) 16:12:09.17ID:IPoqHaAU
>>541
これはなんの言語ですか?
JavaScriptだとどうなるのでしょうか?
10000を超えないのは複数の行について合計した時の話です
メッセージやCSSの処理はどうすればいいでしょうか?
2017/10/14(土) 16:23:07.56ID:6KISst0f
>>545
Ruby & Rails

JavaScriptはしらん。けど大差ないものは作れるだろ
文法上の制約があるとしてんもこんなふうになる程度

validates("col2_value", {numericality: true, presence: true, if: "condition"})

> 10000を超えないのは複数の行について合計した時の話です
一行ごとに保存できるのであれば、保存する時に
この一行を保存するときに10000を超えるかどうかを調べればいい

一行ごとに保存できない、つまりまとめて保存するならば、
一行に相当するオブジェクトに含まれる配列として
テーブル全体を持っておき、そのテーブルの数値の合計を調べれば良い。

> メッセージやCSSの処理はどうすればいいでしょうか?
んなもん、バリデーション結果を返して、そこに含まれるerrorsを
画面に表示すればいいだけ。ローカライゼーションは別の話。
2017/10/14(土) 16:32:34.19ID:IPoqHaAU
>>546
なるほど
なんとなくわかりかけてきました

肝心のエラー情報はどうやって、どのような形式で取得しますか?
検索や保存など処理によって検証内容が異なる場合は似たようなクラスを2つ用意するのでしょうか?
2017/10/14(土) 16:37:58.88ID:6KISst0f
> 肝心のエラー情報はどうやって、どのような形式で取得しますか?
フレームワーク次第なんだんだからそのやり方に従えばいい

> 検索や保存など処理によって検証内容が異なる場合は似たようなクラスを2つ用意するのでしょうか?
似たようなもの=同じではない=違うもの

違うなら別々に用意しなければいけないし、
100%まったく同じならば、使い回せばいい。
一部が全く同じならば、同じ部分だけつかいまわせるように切り出せばいい

絶対にやってはいけないのは、違うところがあるのに
似ているからという理由だけで違うものを使いまわすこと
そんなことをするとある修正が全く無関係な所に影響を及ぼしてしまう。

異なるなら別のものを作るのは当たり前の話だ。
2017/10/14(土) 16:44:22.76ID:wPdsvz2f
>>544
> すべての属性情報が無視していいとは限らないからね。
限るだろ ⇒ >>500 のデータなんだから w
2017/10/14(土) 16:45:47.95ID:6KISst0f
あとなぁ、コピペはいけないってことの意味を勘違いしてるやつが多いんだよな。

単語、文字列をコピペしたらいけない。ファイルをコピペしたら
いけないって勘違いしてる。

コピペしたらいけないのは処理だってーの。
処理はテストするものが定義はテストする意味はない。
定義でするべきなのはテストではなくて確認
確認は目視でもOKなんだよ。

バリデーションなんてほぼ定義にできてしまうのだから
テストする項目にはならない。確認する項目。
だからYAMLに分離して、技術者じゃなくても確認できるようにしておけば良いんだ。
2017/10/14(土) 16:46:45.77ID:IPoqHaAU
>>548
ちなみにrubyだとバリデーション結果はどうなってるんですか?
2017/10/14(土) 16:47:38.90ID:6KISst0f
>>549
問題はExcelには>>500のデータ以外の情報も自由に入れられてしまうところなんだよ。
そしてそれがわかりづらい。
2017/10/14(土) 16:49:56.83ID:6KISst0f
>>551
RubyじゃなくてRailsな。バリデーションはRailsというフレームワークの一機能
バリデーション結果のオブジェクトの中に
errosってのがあってそこに項目ごとにエラーメッセージが入ってる。
またバリデーション結果のオブジェクトにはvalid?、invalid?メソッドがあって
全体がバリデーションでOKだったかどうかもわかる。
2017/10/14(土) 16:55:23.66ID:IPoqHaAU
>>553
どの項目でエラーが出たかはわかりませんか?
背景色を変えるには入力項目のidとrubyオブジェクトのプロパティとのひも付けが必要だと思いますが
ここも粗結合にしたまま対応できるんでしょうか?
2017/10/14(土) 17:01:53.89ID:2Glba8SI
>>541
この場合のcheckboxは更新対象を示すフラグっぽいから
2~4列目のモデルの要素とは別にしたほうがいいんじゃないかな

ONになってる行のコレクション対してバリデーションすればいいので
if conditionは全部消せる
2017/10/14(土) 17:02:08.30ID:6KISst0f
>>554
だからerrorsオブジェクトの中に項目ごとにエラーが入ってるって言ったろ

> 背景色を変えるには入力項目のidとrubyオブジェクトのプロパティとのひも付けが必要だと思いますが
いらねーよ。

どうせエラー画面がでたら、エラーが出たその項目の値を表示するだろ?
その項目のすぐ下にでもエラー情報だせばいいだろ。

あ?id? エラー情報の表示にidなんていらねーからな。
まさかと思うが、CSSに全項目書いてたりしないよな。
それならclass使え。アホらしいから
2017/10/14(土) 17:06:44.40ID:6KISst0f
>>555
そこらへんはどうでもいいやw
重要なのはこの程度でカスタムコード書きまくらないと対応できないとか
思っていたことがはっきりしたってだけ

で、俺の意見はここからさらに先で、Railsのバリデーションコード
あの程度の情報量であれば、YAMLに簡単に外だしできるので、
外出して、客にもレビュー可能にして、価値の低いテストを減らしたい。
YAMLにすればフロントエンド側(JavaScript)でも再利用できるだろうし。
なんでもかんでもクラスに定義するのが良いとは思わないな。
2017/10/14(土) 17:11:55.12ID:ipiotHZI
その先はないので程々にした方がいい
設定ファイルでバリデーションするアイデアはJavaとか他の言語が大昔にとっくに通過していて
世界中でこれは使い物にならんと判定されたものだよ
2017/10/14(土) 17:15:32.80ID:ipiotHZI
バリデーションすなわち入力検証をプレゼンテーションから切り離して考えるのもバカバカしい
入力検証はViewあるいはViewModelに属する処理だからプレゼンテーションに入るのが正解
ドメインモデルに入力検証をやらせるのは愚かとしか言いようがない
2017/10/14(土) 17:16:00.23ID:6KISst0f
> 設定ファイルでバリデーションするアイデアはJavaとか他の言語が大昔にとっくに通過していて

それはXMLが失敗の原因だった。
XMLにはタグや属性という技術者しか知らないものが
あるからだめだったんだよ。
2017/10/14(土) 17:17:14.17ID:6KISst0f
>>559
> 入力検証はViewあるいはViewModelに属する処理だからプレゼンテーションに入るのが正解
YAMLにすることでそれも実現できる

バリデーションは、プレゼンテーションだけのものではない
プレゼンテーションでもドメインモデルでも使われるものだ
2017/10/14(土) 17:20:06.76ID:6KISst0f
更に言うならば、バリデーションはフレームワークではなく
言語仕様に組み込むべきものだよ。
本質的にはD言語の契約プログラミングと同じものなんだから
2017/10/14(土) 17:21:48.23ID:ipiotHZI
>>560
違う

モデル定義とバリデーション定義が離れすぎていること
コンパイルできないから開発環境の恩恵をうまく得られないこと
バリデーションを書くのは開発者であるが開発者に馴染みのある言語はXMLやYAMLではなくJavaやC#であること

これらが問題点
2017/10/14(土) 17:24:16.70ID:6KISst0f
>>563
> バリデーションを書くのは開発者であるが開発者に馴染みのある言語はXMLやYAMLではなくJavaやC#であること

あんたはバリデーション処理とバリデーション定義をごっちゃにしてる。
バリデーション処理は動くコードで書くが、
バリデーション定義は動くコードではない。

JavaのXMLなんかも動くコードではないから
これは定義であり、定義の内容をJavaやC#で書く意味はない。
だってただのデータだぞ?ハッシュで持たせればいい程度の情報。
2017/10/14(土) 17:25:05.23ID:S4q9ZUfo
>>559
俺もその意見に賛成かなぁ

画面が変わったら変わった画面用のチェックが必要になってる気がするわ
2017/10/14(土) 17:25:21.74ID:ipiotHZI
>>561
違う

プレゼンテーションレイヤではオブジェクトが不正な状態を受け入れることが前提
不正な状態を検知する処理がバリデーション

ドメインレイヤではオブジェクトは不正な状態は受け入れない
プロパティの不正な値をセットしようとした瞬間に例外
メソッドに不正な引数を与えた瞬間に例外
これはバリデーションではない
ドメインレイヤでは契約を使う
2017/10/14(土) 17:25:55.08ID:6KISst0f
>>541の例で言えば

 validates :col2_value numericality: true, presence: true, if condition
 validates :col3_value numericality: true, presence: true, if condition
 validates :col2_plus_col3_number less_than_or_equal_to: 1000, if condition
 validates :col2_plus_col3_number less_than_or_equal_to: 10000, if condition

 validates :col4_text; maximun: 10, if condition
 validate :col4_registered

この部分がバリデーション定義。
簡単にYAMLにできるし、客が検証したい部分でも有る。

numericalityの内容とかconditionの内容がバリデーション処理(の一部)
2017/10/14(土) 17:27:05.32ID:6KISst0f
>>566
> ドメインレイヤではオブジェクトは不正な状態は受け入れない
> プロパティの不正な値をセットしようとした瞬間に例外
> メソッドに不正な引数を与えた瞬間に例外
> これはバリデーションではない

バリデーションに引っかかった結果をどう表示するか?が
プレゼンテーションでやるべきこと。

バリデーションそのものは使いまわすことができる。
2017/10/14(土) 17:27:18.82ID:S4q9ZUfo
>>566
ctrl+vで貼った1GBテキストとかメモリに保持すんの?
2017/10/14(土) 17:28:02.59ID:ipiotHZI
>>564
それはあなただけが感じる特殊な感覚だよ
世界中のプログラマは設定ファイルを捨て去り属性やアノテーションを使うようになった
XMLよりYAMLの方が多少マシという点は認めるが上記の手法に比べればどんぐりのせくらべといったところだ
2017/10/14(土) 17:28:38.29ID:6KISst0f
>>570
> 世界中のプログラマは設定ファイルを捨て去り属性やアノテーションを使うようになった

設定ファイルを捨ててYAMLにしたの間違いだろw
2017/10/14(土) 17:29:02.43ID:6KISst0f
設定をYAMLではなくソースコードに埋め込むのを見てみたいもんだがw
2017/10/14(土) 17:30:30.98ID:S4q9ZUfo
お前ら、喧嘩するな
どこに持とうがチェック項目は増えても減ってもいないんだぜ

だったら一番やりやすい画面かな
2017/10/14(土) 17:32:16.56ID:6KISst0f
>>573
いや増えてる。画面でやると画面ごとにバリデーション処理が増えてしまう。
だから数を減らすにはより中心であるモデルで行う必要がある。
2017/10/14(土) 17:32:52.58ID:S4q9ZUfo
ファイルに外だししたからチェックしなくていいですなんて
んなわけねぇだろ

今時エロ本の竿役だってそんなこと言わねぇよ
2017/10/14(土) 17:34:49.45ID:S4q9ZUfo
>>574
チェックはしなきゃ駄目だよ
2017/10/14(土) 17:35:14.23ID:ipiotHZI
>>572
JavaのBean ValidationやC#のDataAnnotationsを調べてみればいい
モデルとバリデーション設定を分離して管理する意味がないとわかるはずだ
2017/10/14(土) 17:39:42.15ID:XRdStdss
>>552
低能相手ならそうかもな
御愁傷様としか言えないけど w
2017/10/14(土) 18:20:50.90ID:6KISst0f
>>575
> ファイルに外だししたからチェックしなくていいですなんて
> んなわけねぇだろ

そんなこと言ってないよw
バリデーションという単純な部分を
外だしすると誰でもチェックできるようになるよ。

そもそもExcelでやっていたことだからね。
Excelという使いづらい形式がYAMLに変わっただけ
誰でもチェックできるってことの意味がわかったかな?


あ、YAMLに変わってプログラムからそれを
そのまま使うってところも違うか。
2017/10/14(土) 19:06:29.37ID:GDzf5CCz
YAMLが誰でも読み書きできると主張しているのはプログラマだけという事実について考える必要があるようだ
エクセルは誰でも読み書きできる
これはプログラマ以外のステークホルダーも同意している
2017/10/14(土) 19:35:21.74ID:LrE/Uk2a
xmlはパンピーには無理
スコープなんて意識できるわけねーし

っていうか俺でも辛い
xmlを編集できるツールがそもそもねーじゃん
責任持ってお前作って配れよ
2017/10/14(土) 21:47:43.86ID:4wM/EQmV
結局のところフレームワーク無しだとif文書きまくるのが最強ということですか?
いわゆるKISSに原則ってやつですね
2017/10/14(土) 21:59:38.46ID:6KISst0f
>>582
if文以外は不要
2017/10/14(土) 22:36:04.01ID:LrE/Uk2a
データからソースコード吐き出すツールでも作ったらどうか?
2017/10/15(日) 00:42:30.20ID:RBDvyi+r
データはRDBMSでもテキストでもなんでもいいだろ
DAOで抽象化しとけば後から変えられる
メンテできるものにしろ
2017/10/15(日) 00:48:50.64ID:/8UsyUgn
>>584
それやるとメンテが大変になるから辞めたほうが良いよ。
変換などせずそのまま使う方がいい
2017/10/15(日) 18:02:34.88ID:nlQ3NzZf
なんか盛り上がってるようだがとりあえず
>>533
に賛成票。
設定が正しいか目視で済ませずテストすべき。
目視チェックで済ませたところが往々にしてトラブルの元。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況