質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.79%

他人の書いたpythonコードからデザインパターンを読み取る

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,144

score 113

最近は、コードリーディングが遅いと感じていて、自信喪失しています。そこで思いついたのが、クラスの設計やコードのデザインパターンを見抜ければ、全体を把握するのが早くなり、コードリーディングが早くなるのではないかと思いました。

例えば、以下のリポジトリのコードの全体像を把握したいです。どのデザインパターンに当てはまると思いますか?
また、どのように全体像を把握していけばよいのですか?どのように勉強してきましたか?クラス設計の理解の助けにある教材やツールを何かご存知でしょうか?

皆さまの意見のtipsから以下のようなロジックで理解していければと思っています。

このクラスは、こんな役割で全体としてこのようなモジュールの役割をしていて、このパッケージはこのためにあり、このパターンはだいたい、こんな感じで書かれる → すでに発掘されている〇〇デザインパターンに当てはまる。→ そのデザインパターンを学ぶにはこの教材がいい。このツールを使うと作りやすい。

コードリーディング対象のリポジトリ
https://github.com/dpgaspar/Flask-AppBuilder/tree/master/flask_appbuilder

すでに、以下の教材はさっと目を通しましたが、どんなときに使えるのか理解できていません、正直、「へーそうなんだ」で終わっています。
https://github.com/faif/python-patterns

Effective Pythonもざっと目を通しましたが、コード設計の全体像を読み取る能力向上には、あまり役立たないように思えます。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/01/29 09:51 編集

    細かい誤字ですが、”自身”喪失だと事件ですよ。

    キャンセル

  • m.ts10806

    2019/01/29 10:00

    そもそも質問者さんは「このデザインパターンだ」とわかれば何とかなるくらいの技術・知識をお持ちなのでしょうか?それで何とかなるならデザインパターンはそもそも基本形なので、全体を見ればどのパターンか見当つきそうなものですが。

    キャンセル

回答 4

+8

Pythonは畑違いなので具体的な内容には触れられないのですが、ちょっと思ったことを。

逆じゃないですか?

デザインパターンをはじめとした様々な「手法」は、いろんな物作りの過程を繰り返す中で、パターン化されたものを体系的に整理してモデルにしたものです。作る人も、

  1. 何かを作ろうとする
  2. 作り方を検討する
  3. 過去に使ったあのケースに類似してる
  4. 適用してみる……うまくいった。これでいこう

という流れでパターンを組み込んでいると思います。まずはその流れをあなた自身が追うという経験を何度繰り返し、パターンに当てはまる場合、当てはまらない場合、どういう場合にどのケースが使えるかといったことを経験して初めて、「この場合はこういうケースが使える」ということが読めるようになるかと。それを何度もやっていくと、本来そのソースがやりたかったことを汲んだ上で「こういう場合はこのパターンが使えるけど……あ、やっぱりね。やってるね」みたいな感じで使っているデザインパターンや手法を読み取れるようになるんじゃないでしょうか。

世の中のプログラムはすべていずれかのデザインパターンでできているわけではありません。特定の場合、条件を満たす場合に、いつものやり方が採用できる、というだけで、実際は全くそういうものを使っていなかったり、部分的に使ったり、アレンジしたバージョンだったり様々です。

なのではなから「どのパターンですか?」という見方でソースを読もうとすると、そもそもそのソースがやりたいことを見ずに、パターンにマッチする部分を探す「もしかしたら正解がないかも知れないパズルゲーム」になってしまいます。結果、時間がかかる……。そんな風になってませんか?

冒頭に書いたように、物作りを繰り返す中で何度も出てくるケースをまとめたモノがデザインパターンですから、デザインパターン本を何度読み返しても、「はぁ、まぁ、そうだよね」としかなりません。いわば建築手法の本、柱や木の削り方、組み合わせ方だけを学んで、「で、これってどこで使うの?」となっているようなもの。
実際に作る経験をもっと積んで、そのデザインパターンや手法がいかに便利で、筋の通っているモノであるかを実体験することを繰り返された方が良いように思います。

見当外れの回答かもしれませんが参考になれば。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/29 10:57 編集

    おっしゃる通りです、本来なら帰納的に学習するべきですが、演繹的にばっと当てはめることもできないのも理解しています。ただ、本当にそういうものなのか、という部分に自信がもてず、投稿しました。ありがとうございます。

    キャンセル

+4

まず、「最初からコードを読むもんじゃない」「他人の書いたコードは所詮他人が書いたコード」というのがtipsの筆頭になります。あとは私がどの様に対象のリポジトリを見ていったのかをちょっとだけ記載します。

URLを開く

まず以下の画面で私は「多い」と思って中を見てみようという気が失せました。

repo

READMEに移る

READMEを見るとちゃんとドキュメントへのリンクがあったので少し安心しました。

readme

Documentationを開く

ドキュメントを眺めるとIntroductionやInstallationに加えてexampleやDemoも準備されているので、そこら辺は最低でも読んである程度理解しておかないとコードなんて読めたもんじゃないだろうなと感じました。

doc

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

ほぼほぼ、backyardさんが言いたいこと書いてますので端的に。

ソースリーディングが遅いのは、自身の問題以外にソースそのものに問題があるケースもあります。
※当該リンクのソースは見ていない

デザインパターンを見抜ければ、全体を把握するのが早くなり

そんなことありません。

このクラスは、こんな役割で全体としてこのようなモジュールの役割をしていて、このパッケージはこのためにあり、このパターンはだいたい、こんな感じで書かれる → すでに発掘されている〇〇デザインパターンに当てはまる。→ そのデザインパターンを学ぶにはこの教材がいい。このツールを使うと作りやすい。

backyardさんの指摘の通り逆じゃないですか?

デザインパターン自体は、GoF以外にもいっぱいありますし、知らないだけで使ってるパターンもいくつもあります。

ただ、その用途(問題と解決)について理解してつかってない人もたくさんいます。
デザインパターンを学ぶならソースよりも、デザインパターン本を読むのがいいです。

で、ソースリーディングするにあたってクラス図のリバースが理解を早めることになると思います。
Python専門外ですが、Epydoc、Pyreverseなどのツールがあるようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/29 10:52

    こんなにあるらしい。
    https://modeling-languages.com/uml-tools/#python

    キャンセル

  • 2019/01/29 11:04

    momon-gaさんの意見がまさに確認したいことでした。ありがとうございます。

    > で、ソースリーディングするにあたってクラス図のリバースが理解を早めることになると思います。
    Python専門外ですが、Epydoc、Pyreverseなどのツールがあるようです。

    これが特に知りたかったことでした。

    キャンセル

+2

「以下のリポジトリのコードの全体像を把握したいです。」のあとに「どのデザインパターンに当てはまると思いますか?」と書いてある時点で破綻してると思いますが、、、リポジトリ丸ごとに当てはめるようなものでしょうか、デザインパターンって。

「わからないところがわからない」状況なら、まずはどこでつっかえているのかをちゃんと明らかにしましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/29 11:01

    > 「以下のリポジトリのコードの全体像を把握したいです。」のあとに「どのデザインパターンに当てはまると思いますか?」と書いてある時点で破綻してると思いますが、、、リポジトリ丸ごとに当てはめるようなものでしょうか、デザインパターンって。

    とてもいい指摘ありがとうございます!モジュールの依存関係の把握とコード設計の理解の二つの問題が私の頭の中でごちゃごちゃになっていたのだなときづきました。それらがコードリーディングに影響するのだと理解しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問