Python初心者です。
学校の部活動で、ある簡単なアプリを開発しています。これまでもアプリを作ってみたことはあるのですが、その際にどうしてもコードが複雑化してしまい(具体的に言うと変数や関数が多すぎる、関数の呼び出しが飛び飛びになっていて読むときにコードを行ったり来たりしなければならなくなる)、後で読んだ時に何をしているのかわからなくことが度々あります。
そこでアプリ開発において質問させていただきたいことがいくつかあります。
1.グローバル変数を極力使わないようにするにはどうすればいいか
2.コーディングに移る前にアプリの設計やアルゴリズムを紙に書いておき、整理しておくべきか(しかし、それだと機能の追加がしにくくなってしまう気がします。)
3.処理はなんでもかんでも関数内に入れるべきではないのか
以上、3点にお答えいただけると嬉しいです。回答、よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ちゃんと回答に答えてなくてすいませんが、
部活でやっているなら同じ部活のメンバーや、顧問の先生にコードレビューして貰えばいいんじゃないですかね。
投稿2021/06/17 06:51
退会済みユーザー
総合スコア0
0
プログラミングの世界の黎明期から言われてる事ですが「分割して統治せよ」という考え方が大原則としてあります。
人間の脳は、短期的に効率よく記憶しておける事柄に限りがあるので、なるべく関心事を小さな事柄に分割して考えないと混乱するからです。そのため、例えば「関数内の引数や変数の数を8つ以下にしなさい」というような規約を定めたりする場合もあります。
とはいえ、扱う対象のシステムが巨大化するにつれ、単に関数をたくさんに分割するだけだと、その「分割されたたくさんの関数」を頭に入れないといけなくなります。
そこで、複数の関数やそれに関連するデータ等、ある程度意味のある集合を作り、その集合に対して名前を付けて管理する、という考え方が出てきます。
そうすることで、システム内における個別の関心事を分割する事ができ、その「意味のある集合」を階層化して管理することで、より巨視的に見た集合というレベルでシステム全体を管理する事ができるようになります。
これが構造化プログラミングであったり、オブジェクト指向であったりという、プログラミングパラダイムが発展してきた背景です。
なので、例えばPythonであればオブジェクト指向というパラダイムをサポートしている言語ですので、簡単に言えば「オブジェクト指向」を身に着けましょう、というのが第一です。
で、
変数や関数が多すぎる、
これは「数が多い」事が問題の本質ではなく、「適切な粒度でまとめられていない」のが問題でしょう。
システムの機能が増えれば、当然必要になる関数や変数(ここでは一時的に利用するデータ、ぐらいの意味で考えてますが)は当然多くなります。
その多くなった関数や変数を適切にグルーピングしてまとめる「オブジェクト指向設計」のスキルが足りていません。
関数の呼び出しが飛び飛びになっていて読むときにコードを行ったり来たりしなければならなくなる
これはうまく抽象化できていないためでしょう。
例えば料理を作る手順をプログラミングするとして、
・肉に塩を振る
・肉に胡椒を振る
・コンロにフライパンを置く
・フライパンに油を敷く
・コンロに火を付ける
・肉をプライパンに載せて焼く
みたいなレベルで説明されても細かすぎてよくわかりません。
なのでまず、
・肉に下味をつける
・プライパンでソテーする
というレベルで手順化(関数化)し、
・肉に下味をつける
1)肉に塩を振る
2)肉に胡椒を振る
・プライパンでソテーする
1)フライパンをコンロにセットする
2)棚にある油をフライパンに敷く
3)肉を焼く
みたいに階層化して、それぞれの階層で頭に入れるべきことを分割します。
こうすると、関連するコードは近くにあるため、無闇にコード中を飛び回る事はなくなります。
1.グローバル変数を極力使わないようにするにはどうすればいいか
で、上記を踏まえると、「グローバル変数」というのが非常に厄介である事は理解できると思います。
せっかく抽象化、細分化したプログラムにグローバル変数というシステム全体から参照・変更されるデータが出てきてしまうと、上記の努力が水の泡になります。
なので基本的に「グローバル変数など一切使わない」ぐらいの気持ちで作るべきです。
利用するデータを上手くまとめ、階層化して管理できていれば、そもそも「どこからでも参照・変更できるデータ」は必要ありません。
それは常に近くの階層(上の階層)にあるはずです。
2.コーディングに移る前にアプリの設計やアルゴリズムを紙に書いておき、整理しておくべきか(しかし、それだと機能の追加がしにくくなってしまう気がします。)
個人で適当に書く規模なら必要ありませんが、一定以上大きなシステムであれば当然書くべきです。
そうしないと、それこそ機能の追加をしようとした時にどこ影響があるのか、他の部分と重複していないか、等をチェックができなくなります。
3.処理はなんでもかんでも関数内に入れるべきではないのか
これはちょっと意図がわかりません。
どの関数にも書かれていない処理は「処理できません」。
投稿2021/06/16 13:52
総合スコア8947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
1.グローバル変数を極力使わないようにするにはどうすればいいか
グローバル変数とその中身は最初に設定したときを除いて絶対に変更しないでプログラムを書く練習をしましょう。
これは3ヶ月ぐらいやっていると、かなりできるようになります。
2.コーディングに移る前にアプリの設計やアルゴリズムを紙に書いておき、整理しておくべきか(しかし、それだと機能の追加がしにくくなってしまう気がします。)
紙にするのはやめておいた方が良いと思います。そういうものは機械可読なドキュメントにしましょう。
Pythonの場合には、ドキュメント文字列というものがあるので、これで書いておくのが良いと思っています。
3.処理はなんでもかんでも関数内に入れるべきではないのか
はい。ロジックの部分は関数やクラスで実装すべきです。
ただ、あまり複雑な関数を作るのはやめましょう。引数のチェックを除いて、ループは一個以下、if文も一個以下を目指してください、入門者の方の作るプログラムであれば、引数のチェックを除いて5行以下が望ましく、最大でも10行以下にしてください。そういうプログラムを書く訓練をすれば、確実に実力が付きます。
そうやって実力が上がって、より高度なプログラムを作るときには、こういう制約を破らなければならないのがどういう場合かがわかるようになってきます。
投稿2021/06/16 11:38
総合スコア24668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
1.グローバル変数を極力使わないようにするにはどうすればいいか
グローバル変数を使いたくなる理由は何ですか?
引数が沢山になってしまう、ということであれば、それらをdictに格納しておくことで、受け渡しはすっきりさせることができるでしょう。
そのdictは他ではあまに使われないということであれば、その関数の設計があまりよくないのかもしれません。
2.コーディングに移る前にアプリの設計やアルゴリズムを紙に書いておき、整理しておくべきか(しかし、それだと機能の追加がしにくくなってしまう気がします。)
何らかの形で書き出すべきです。書いてみることで整理することもできますし、共有することも可能です。イメージだけでコーディングを開始してしまうと、見方が局所的になってしまい、進む道を間違える可能性が高くなります。
コーディングしていて方針を変えるのはよくあることです。そのときにも、資料に立ち帰って検討すべきです。
3.処理はなんでもかんでも関数内に入れるべきではないのか
関数内に入れないっていうのはどういうことでしょうか?
自分は基本的には全ての処理は関数に入れてます。 起動時の引数の扱いくらいですかね、関数に入れないのは。
※ 以下気になったところ
その際にどうしてもコードが複雑化してしまい(具体的に言うと変数や関数が多すぎる、
多過ぎるってどれくらいですか?
慣れていないだけとか? 適切にフォルダ分けしていないだけとか?
全般的な話は最後に。
関数の呼び出しが飛び飛びになっていて読むときにコードを行ったり来たりしなければならなくなる)、
どのようなエディタを使っていますか? よいエディタであれば定義の場所に飛んだり 、戻ったりすることが簡単にできるようになっています。
後で読んだ時に何をしているのかわからなくことが度々あります。
それこそ、ちゃんと設計をせず、いきあたりばったりでコーディングしているからではないでしょうか。
大抵のプログラムはメインのルーチンがあって処理を呼び出しながら進みます。 メインのルーチンは1つの関数に入るでしょう。
長くなるようであれば、適切な塊をサブルーチンとして切り出して、そこにまた流れをつくるでしょう。
こういう手順を蹈んでいないと、メインのルーチンが無くなり、どこかに行ったまま帰ってこない処理などができてしまいやすくなります。
また、適切にサプルーチン化していれば、「これはDBに値を書き留む処理だ」などわかりやすくなるので、読み易いはずです。 また、グローバル変数を使っていなければ、どのような動作をするのかは、中に入ってみなくてもわかるでしょう。
他にもいろいろ書きたいことはありますがこれくらいで。
質問を読んでみて思うのは、ちゃんと設計せずにコードが書かれているために、追い掛けにくつて、理解しにくいものになってしまっているのではないかということ。
やはり、あらかじきちんと設計をしてみてはどうでしょう。
テキストで充分です、というより、最近ではテキスト(MarkDown)で書いて、gitで変更履歴管理をしていたりします。
投稿2021/06/16 11:36
総合スコア13687
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
1は、よくやるのは引数で連れ回す方法ですが、あまり引数が多くなってしまうとそれはそれで読みづらくなってしまうのでいくつかの変数をクラスにまとめておくと良いかと思います。
いわゆる「コンテキストクラス」みたいな言われ方をよくされていますね(自分だけかも)。
ただ、個人的にはある程度は使ってもいいのかなと思ったり(実行開始時に一回初期化してあとずっと変更しない、みたいなものならグローバルにおいちゃっていいと思います)。
設計を紙に書くなりして整理するのはとてもいいことだと思います。アプリの開発規模がちょっとよくわからないですが、複数人でやるなら現物を見ながら意思を統一できるといったメリットもありますね。
3はそうですね、なんでもかんでも入れるのは良くないかなと思います。
Pythonというか手続き型言語における関数は、どっちかというと「名前のついた処理の塊」なので適切に名前をつけるべきだし、その名前の意味から外れた処理はさせないほうが良いです。
投稿2021/06/16 09:42
総合スコア283
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。