テーマ、知りたいこと
コードが長くなった時にどのようにコードを分けるべきか教えてください!
背景、状況
現在、Flutterを用いてアプリ開発を行っています。
最初のころはよかったのですが、
だんだんコードが複雑になってきて1つのファイルにすると何千行にもなってしまいます。
そこでコードをいくつかのファイルに分けて管理しようと思うのですが、
ファイルを分ける際の観点などを教えてください。
あまりに分けすぎると変数の受け渡しがめんどくさくなってしまったりしてしまいます。
機能ごとに分けるべきでしょうか?
それとも100行ごとに分ける
のようにするべきでしょうか?
先輩の皆さん教えてください!
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
#1
総合スコア14369
投稿2025/05/22 10:48
あまりに分けすぎると変数の受け渡しがめんどくさくなってしまったりしてしまいます。
どうしてそうなるのでしょう? そのプログラムは関数化されていないということでしょうか?
であれば、まずは、関数化していくのがいいのではないかと思います。
#2
総合スコア855
投稿2025/05/22 13:07
編集2025/05/22 13:18Flutterの経験が無く、flutterのパクリみたいなkotlinでの開発経験を元に回答しますが、
現状どう分けているのかという話から始まりますが、 UIとアクション(イベント)、永続データ(Model層)は流石に分かれていると思うので、その中間処理をどう分けるのかという話になるのだと思いますが、
レイヤーとか、アーキテクチャとかいう単語で検索すると色々ヒットするかも?と思います。
https://zenn.dev/kentt8046/articles/20241013-flutter-arcitecture
ただ、規模が大きくなると構成要素を再構築した方が良くなる、というのはある程度自然な流れなのかなとも思っていて、
(初めから完全に構成要素を選んでいたらスムーズに開発できるけど、あまりにも初期のコストが高い)
現状は、
Model層とやり取りするためのRepostry層を作って、Modelとアプリ間でのつなぎ役を担うことと、
そのための変換処理をそのレイヤー以外で行わないようにすることで、デバッグはやりやすくなるのかなと思います。
https://zenn.dev/humanhacker/articles/bbfb97a0d146bc
Kotlinの場合だと、UIとViewModelでデータバインディングを使うとか、XMLレイアウト時ではオブザーブパターンを使うなどで、似たコードが別の行に都度現れるみたいな問題は回避出来ましたがそういうのは流石に取り入れてるんでしょうか。
(自分が携わったプロジェクトは始動時のメンバーのスキルや学習意欲がそんなになかったみたいで、全くそこら辺のセオリーが守られてなかったので...)
1000行だとかは、まあ見づらくはありますが、何となく変換処理とかマジで意味ない処理がある行群を占領しているとかでない鍵り、
不具合の対応や機能追加の対応という課題そのものを整理できてなくて、コードも追いづらいとかになってるのかもな?とか、変な考察をしてしまいます。
プライベートで作るようなシンプルなアプリなら
MVVMの分離、ヘルパーはガッツリ作りまくる、
くらいのスタンスで整理出来るのかなぁと思いますが、
どう分離するのかはかなり要件によるのかもしれないです。
あ、それと、変数の受け渡しがめんどくさいについてですが、
引き継ぐ身になれば、ひとつのクラスの中でプロパティをグローバル変数のように使われている方が100倍苦しいです。
(もちろん、テスト駆動で作ると、変数の受け渡しつまり、関数の分離がそもそもできてないとテストの使用がないですが、割愛)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア4307
投稿2025/05/25 15:11
こんにちは。
あまり設計について詳しくないものと見受けられるので、強火のアイデアだけ書いておきます。
コードを分割するときどのくらい分けるかというと、1行単位で、全部バラバラにする勢いで分けます。
1行でも複数の処理が含まれていたら全部分けるくらい分けます。
例えば「○○して、○○する。」という行があったら、それは2つの手続きが含まれるので、2つの関数に分けられますね。
そうやって、物理的に分けられない単位まで分けたあとに、「これとこれはひとまとまりだよな」と思うものをまとめていく作業を行うのです。
世のプログラマは設計に慣れているので、「分けた後、まとめる」という作業をすっ飛ばして最初から完成形を目指していけるようになっているだけなのです。
やる気があるなら、まずは限界まで分割にチャレンジしてみてください。引数の値の引き渡しなど死ぬほどめんどくさいかもしれませんが、「実際にどう分割するのが良いのか」を一発で魂で理解できると思います。オススメです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア44
投稿2025/05/26 11:36
良く分からんのだけど。
特にFlutterとか全然知らんし。
でも、
ファイルを分ける際の観点
と言うよか、ディレクトリを分ける際の観点、になるのかな。
例えば、今書いてるプログラムがsrcディレクトリ内にある、って場合。
書いてるプログラム内で「汎用で使いまわせそう」ってパーツがある、と言う場合、そこだけlibディレクトリを作って分けておく、と。
例えば何らかのルールで記述されたテキストファイルを読み込んでそれを処理する、とかなった時。一種の構文解析をせなアカンくなるわけだけれども、「あるフォーマットに従った構文解析」ってなった場合、それに関する部分はある種「汎用性がある」わけでしょ?そこだけコピペして別ファイルにしておいて、libディレクトリへと突っ込んでおく。
そうすれば「似たようなプログラムを書かざるを得なかった」場合に、自作ライブラリとして流用が可能となる・・・みたいな、ね。
要するに書いてるプログラムの「意味」、つまり「機能」をある程度分割出来る、って前提になる。「意味」とか「機能」を「まとまり」として見れるかどうか、だよな。
あと、僕は#1氏の意見に完全に同意するんだけど、
あまりに分けすぎると変数の受け渡しがめんどくさくなってしまったりしてしまいます。
ってのは通常考えられないんだ。関数単位、とかクラス単位、にフツーはなるんじゃないか、と。
確かに場合によっては大域変数/グローバル変数を別ファイルにまとめる、って事はあり得るんだけど、通常、引数にツッコむ変数を「受け渡しする」ようにファイルを分割する、ってのはあり得ないんだよな。
だから、「プログラムの関数化」なり「プログラムのクラス化」が上手く行ってないんじゃないか、と言う畏れはあるよね。単に巨大なスクリプト化してる?
だとすれば、元々マズい書き方をしてんじゃないか、と。
そんな事をチラッと思いました。マル。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#6
総合スコア12181
投稿2025/05/27 01:31
編集2025/05/27 01:331つのファイルにすると何千行にもなってしまいます。
そこでコードをいくつかのファイルに分けて管理しようと思う
おそらくは「そこで」の部分に 目的/方針/etc みたいなのが詰まっているハズ.
何千行になったファイルというのが出来上がったとして,それで何が問題だというのか? 何か困ることがあるのだろうか?
何を解決したいという話?
「なんとなく行数が多いのが嫌だから→どうにかして総行数を減らしたいかも」みたいな話なのか,その他なのか.
「その他」なのであれば「その他」とは具体的に何か?
……そこを考えてみては.
他者の言う「~べき」みたいな理屈(?)の話もある程度参考にはなり得るだろうけども,
まずは「ご自身の困りごとを解決すること」というのが第一目的あるハズなので,そこをはっきりさせるのが良いかと.
何かをやりやすくするために→分ける のでしょうから,
現状特に何も困ってないならば,わざわざ時間と労力をかけて「めんどくさくなる」方向に進む意義は無いわけですし.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#7
総合スコア23651
投稿2025/05/30 09:52
Flutter ってオブジェクト指向言語ですよね?
だと、ファイルを分割する とうよりも、class 毎にfileを作る というのが良いのでは
class にどうやって分けるんだ! と言うのは上の方に色々ヒントが書かれている
でね、
「変数の受け渡しがめんどくさく」ならないようにするには オブジェクト指向でよく言われる「結合の少ないシステム」にするです。オブジェクト指向に限らないけど。
結合の少ないシステム にするには
他のclassの中を覗き込まない
自分のclassの中身はさらさない
自分のことは自分でやる
あいつがやるべきことはあいつに任せる
あることを行なう関数/methodは必要な情報を一番抱えているclassにやらせる
すると
引数==外から渡す「method実行に必要な情報」 は減る
あ〜〜〜!
そういうソフトが書けたならもっとBUGの少ないのが作れるのになぁ。。。自戒
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。