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

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

ただいまの
回答率

88.59%

クラス内のメソッドの書き方と、それらを使用した処理のさせ方

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,234

tarotarosu

score 114

前提・実現したいこと

少し違和感を感じたため質問させていただきます。

今、実装したいprocessingという処理があったとします。これらは、method1、method2、method3という3つの処理に分けて書くことができそうだったので、以下のようなコードを実装しました(例はrubyですが言語は何でも構いません)。
私が違和感を感じた部分は下記コードのprocessing内です。
processing内のように各methodを順番に処理したいだけの場合、method1、method2、method3と分けずに、直接1つにまとめて記述してもいいのかなと思いました。

1つの処理を複数のメソッドに分け、別のメソッドからそれらを呼び出して順番に処理を実行させ、目的の処理を実現する下記のようなコードの書き方は普通なことなのでしょうか?
ぼんやりとした質問ですが、何かご回答を頂けると助かります_(._.)_

class Hoge
  def processing
    method1()
    method2()
    method3()
  end

  def method1
    #何らかの処理1
  end

  def method2
    #何らかの処理2
  end

  def method3
    #何らかの処理3
  end
end

hoge = Hoge.new()
hoge.processing()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+2

普通なことなのでしょうか?

それは昔から普通にありますし、
オブジェクト指向的に筋の良い書き方です。

元祖OOPのSmalltalkのコミュニティでそうしてましたから。
ケント・ベックの「Composed Method」パターンですね。

基本中の基本だと考えて、私も普段からなるべくそう書いてます。


私が違和感を感じた部分
直接1つにまとめて記述してもいいのかな

質問者の方が感じる違和感というのは、冗長になるということですよね。

しかし、今は機械のコストより、人間のコストの方が高いので、
行数を節約するよりも、人間の理解コストを節約すべきです。

『リーダブルコード』でも、
行数の短さより、理解にかかる時間の短さを重視していました。

書く立場からすると、処理が自明なので、メソッド分割は無意味に見えますが、
読む立場からすると、保守と修正を前提としたときに、読みやすくなります。

だから、一年後に読めば、自分で書いていても、処理の概要を忘れてますから、
分割してある方が読みやすくて良いと思うはずです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/23 21:34

    ご回答ありがとうございます。
    違和感を感じていたのはまさに「冗長になるのではないか」という点です。
    無意味そうに思えるメソッドの分割も保守性の面から考えると非常に重要なのですね!

    キャンセル

+2

すごく一般的です。

例えば本で例えると小説だと、頭から読む前提なので特に章立てしてなくて目次もないのですが、辞書がそれだときついですよね。

なので、processingという処理(変な言葉だ)は、大まかにいってこのような作業から成り立っていますよということを宣言しているわけです。

辞書を頭から読むと知らない単語が多すぎて混乱するように、ソースコードもあたまから読むと混乱します。したがって、章立てして調べたい部分の記述をまっすぐ身に行けるようにしておいたほうが良いのです。

そういった意味で、処理を分ける書き方が一般的です。また、”OOというメソッドは、XXを引数に**を返す”と定義することになるので、メソッドでやることが明確になり、わかりやすいコードが書けるという利点もあります。

補足して言うと、もちろん他の処理からメソッドを呼び出すコードの再利用にも必要な行為です。しかし、私は再利用を理由にした分割では、粒立ちが大きすぎると感じています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/21 13:11

    ご回答ありがとうございます。
    混乱を回避し、見通しのよいコードを書くためにも、一つの処理を各メソッドに分けて記述することが重要なのですね。
    その目的の為であるならば、仮にmethod1、method2、method3が他ではほとんど使われない処理であっても、処理を分けることは望ましいことであるという解釈でよろしいですか?

    キャンセル

  • 2016/10/21 13:16

    すみません。補足でその部分に関しては触れていましたね...

    キャンセル

+2

1つの処理を複数のメソッドに分け、別のメソッドからそれらを呼び出して順番に処理を実行させ、目的の処理を実現する下記のようなコードの書き方は普通なことなのでしょうか? 

普通ですし望ましいと考えます。


例えば、何かを買う処理をする際に

  • それが売っている一番いい店を探し
  • そのサイトにloginし
  • 注文する

を1発でやってくれる buy メソッドを考えると

def buy(product)
  shop = find_good_shop(product)
  login_to(shop).order(product)
end

こんな感じになるんじゃないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

Hogeクラスのmethod1,2,3が他でもよく使う処理なのであればメソッド化するのはよい手段だと思います。

また、method1,2,3の中で行われる何らかの処理の行数が多く、可読性に欠けるなど問題があるのであれば分けておくという手もあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/21 13:11 編集

    すみません。コメントの投稿を誤ったため編集します。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る