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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

4回答

1838閲覧

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

tarotarosu

総合スコア114

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

2グッド

1クリップ

投稿2016/10/21 01:35

編集2016/10/21 01:36

###前提・実現したいこと
少し違和感を感じたため質問させていただきます。

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

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

###例

ruby

1class Hoge 2 def processing 3 method1() 4 method2() 5 method3() 6 end 7 8 def method1 9 #何らかの処理1 10 end 11 12 def method2 13 #何らかの処理2 14 end 15 16 def method3 17 #何らかの処理3 18 end 19end 20 21hoge = Hoge.new() 22hoge.processing()
LLman, y-doi👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

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

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

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


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

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

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

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

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

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

投稿2016/10/22 17:09

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarotarosu

2016/10/23 12:34

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

0

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

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


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

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

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

ruby

1def buy(product) 2 shop = find_good_shop(product) 3 login_to(shop).order(product) 4end

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

投稿2016/10/21 03:05

hana-da

総合スコア1728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

すごく一般的です。

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

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

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

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

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

投稿2016/10/21 01:57

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarotarosu

2016/10/21 04:11

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

2016/10/21 04:16

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

0

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

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

投稿2016/10/21 02:00

s.t.

総合スコア2021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarotarosu

2016/10/21 04:12 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問