yalkey(ヤルキー)の開発メンバーのギニーです。東大→東大院。IT系のアルバイトにて3年程実務経験あり。これからyalkeyに便利機能をたくさん追加していきたいと思いますので、要望などあれば気軽にお問い合わせください!
RiverpodのstateNotifierでstateをインスタンスにした時、
インスタンスの値の変更を各々検知して、限定した再レンダリングしてくれる(GPTはそう答えたが...)と思いきや
各々のウィジェットをConsumerでラップする必要があることが判明。
原理を考えれば当たり前でした。
Riverpodの優位性はグローバルな状態管理。
https://scrapbox.io/osamtimizer/Flutter%E3%81%A7Provider%E3%81%8B%E3%82%89Riverpod%E3%81%AB%E4%B9%97%E3%82%8A%E6%8F%9B%E3%81%88%E3%82%8B%E3%81%B9%E3%81%8D%E3%81%AA%E3%81%AE%E3%81%8B
DDDはコンテキストが大事という話。
「乗り物」のふるまいについて考える。
「商品の配送システム」を設計するとしよう。
関心事としては、目的地や配送内容、スケジュール通りか、といったことなので、
「乗り物」には目的地という変数が与えられるかもしれないし、
スケジュール通りかをtrue / falseで返すメソッドを定義するかもしれない。
一方で「運転手の雇用システム」となると話は変わってくる。
その乗り物を運転するのに必要な免許は何かとか、保険に入っているかとか、
コンプライアンス的なところに焦点を当てて設計することになる。
他にも「遊園地のアトラクション」とか「中古車販売」など、
様々な文脈で「乗り物」は出てくるが、それぞれ関心事は全く異なる。
関心事の境界線をきちんと定義して、「乗り物」にどのようなメソッドを持たせればいいかを考えることが重要。
(少なくとも「配送システム」で、乗り物に必要な免許種は必要な情報ではない。)
https://www.youtube.com/watch?v=8XmXhXH_q90
A「まり男がくり坊を踏む」というふるまいを設計したいときに
① 「主人公が敵を倒す」という抽象的な処理
② 「主人公=まり男、敵=くり坊、倒す=主人公が敵を踏む」という①の具体的な設定
という二つの処理を切り分けることを考える。
ここで、②のような具体的な設定のことを「依存性」や「実装」などと呼び、①に対して②の設定を行うことを「依存性の注入」と呼ぶ。
(抽象的なロジック①に具体的な実装②が注入されて、システムに血が巡っていくイメージ)
そうすることで、まり男→るい次、くり坊→のこ鋸、踏む→ヒップドロップに代わっても②を設定しなおすだけでいい。つまり変更に強い
システム設計ではまり男とかるい次とかがPostgreSQLとかMySQLになったり、はたまた外部APIになったりするという話。
また、わざわざDBやAPIを用意しなくてもそれを簡易的に真似た(モックした)設定を用意して注入すれば、①のみ切り出してテストすることができる。
他にも、関心事が分かれているのでコードの責務も明確になり、どこに何が書いてあるかが分かりやすい→保守がしやすいなどなど、、、
たくさんのメリットがある。
ちなみに、Aをどのようにかみ砕いて設計するかを極めようとすると、DDDの思想に行きつく気がする。
メモ
・sqfliteのDBHelperはアプリ全体で同じものを使いたいのでシングルトンが有効
・初めてアクセスしたときのみ実行する遅延初期化
・FlutterはシングルのUIスレッドを使うので、同期化や先行インスタンス作成などのオーバーヘッドなマルチスレッド対策は必要ない
https://gist.github.com/ankesh-kumar/698819e25534c79ab91fa2604912e24c
ひとまずベストプラクティスにのっとりアプリケーションサービス層に書くのがよさそう。
https://zenn.dev/link/comments/2a32ddd58f0d09
[萩原 彰 さんに対する返信]
[𝙿𝚞𝚛𝚙𝚕𝚎 さんに対する返信]
私は高1, 2の頃は総合的研究と検定教科書を読み漁っていました。ご参考までに!
https://amzn.asia/d/iBHWqUt
[𝙿𝚞𝚛𝚙𝚕𝚎 さんに対する返信]
むしろ今のうちに聞いておいた方がいいかも??
もし心配なら、①自分はどういう風に考えたか②解法のどこが理解できないのかなどを書くと、間違いないと思います。
さて、今回の問題について、解法だけであれば式変形だけお教えできるかもしれませんが、丁度よいので以前お伝えした「高校数学は論理が重要」ということの実例として説明しましょう。
今回の問題のキーワードは「同値変形」です。同値変形とは簡単に言うと、式の意味は同じ状態で変形していくという風に考えればよいでしょう。
厳密にいうと、AとBが同値である(省略してA⇔Bとも表記します)とは、AならばB(A⇒B)かつBならばA(B⇒A)が成り立つという意味になります。これはとても重要です。
なじみないかもしれませんが、中学まで解いてきた等式とか不等式の「解」というのは高校的に言うとxについて最も簡単な形に同値変形したものです。
等式の性質として、両辺は同じ数を足しても、引いても、掛けても、(0以外の数で)割っても同値です。(不等式は掛け算・割り算で不等号の向きが変わります)
それを使って、例えば一次式7x+5=19を解けという問題が出たとき、、、
7x+5=19
⇔7x+5-5=19-5 (∵両辺に同じ数5を引いても同値)
⇔7x=14
⇔7x/7=14/7 (∵ 両辺に同じ数7を引いても同値)
⇔x=2 (一番簡単な形の同値式!!)
(∵は「なぜならば」という意味です)
再度言いますが、中学まで感覚的にやっていた「xについて解く」という行為は、高校数学では「一番簡単な同値式に変形する」という意味になります。
この考え方はかなり難しいと思います。一か月くらいかけてじんわり理解できるようなものかもしれません。ただ、これが理解できれば高校数学では怖いものなしになれます。
さて、今回の不等式について同値変形していきます。同値変形のコツはxについてまとめることです。
ax≦-2x+3≦bx+2・・・(与式)
⇔ax≦-2x+3 かつ -2x+3≦bx+2
⇔(a+2)x≦3 かつ 1≦(b+2)x(∵それぞれ両辺に2xを足す)
⇔x≦3/(a+2)かつ1/(b+2)≦x (∵a, bは正の値⇒a+2>0, b+2>0であるため両辺割っても不統合の向きは変わらない)
⇔1/(b+2)≦x≦3/(a+2) ・・・①
各所の同値変形(A⇔B)で分からないところがあれば、AならばBかつBならばAであるかを確認してみてください。
①が1/10≦x≦1/5と同値である、すなわち同じ式となるので、
1/(b+2)=1/10かつ3/(a+2)=1/5
⇔b=8かつa=13
となります。
正直必要以上のことを教えていますが、高校数学では式変形一つでも論理的に説明されるということを認識してもらえれば今回は大丈夫です。
あわせて、教科書の必要条件、十分条件といった項を参照すると理解の手助けになると思います。
© yalkey