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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

5回答

4094閲覧

「他のクラスに書かれている処理に遷移するためのメソッド」について

otabeb

総合スコア26

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2016/12/15 01:32

編集2016/12/15 02:58

閲覧ありがとうございます。
プログラムを書いていると、以下の例の★のように
1クラスの1メソッドを極力少なくするために「他のクラスに書かれている処理に遷移するためのメソッド」を作ることがあります。
(以下の例はロジックを書くクラスです。コントローラーにtrue,falseを渡して画面遷移の判断材料にしています)

例 public boolean posting(String text, String address, String penName, Part file) { if (function.checkNull(text) && function.checkNull(file)) { function.addErrorMessage("文章または画像を入力してください。"); return false; } if (function.checkNull(file)) { //文章のみの登録 transitDao(text, address, penName, "noImage.jpg"); return true; } if (checkFile(file)) { //画像のみor文章・画像の登録 String fileName = uploadFolder(file); transitDao(text, address, penName, fileName); return true; } function.addErrorMessage("画像はJPG形式の画像のみ使用できます。"); return false; } ....... ★ /** * functionクラスにある「プロジェクト下にある画像フォルダに画像を登録するメソッド」に遷移します。 * @param file 投稿した画像 * @return 画像名 */ private String uploadFolder(Part file) { String fileName = function.getFileName(file); function.uploadFolder(file, fileName); return fileName; }

現在この「他のクラスに書かれている処理に遷移するためのメソッド」に違和感を感じているのですが、皆様はこのようなメソッドを作成しているのでしょうか。回答よろしくお願いします。

、、、
回答をいただいてソースを少しだけ修正しました。
遷移するためのメソッドを消して直接その遷移先に遷移するように修正しました(☆の部分です)。ありがとうございます。

public boolean posting(String text, String address, String penName, Part file) { if (function.checkNull(text) && function.checkNull(file)) { function.addErrorMessage("文章または画像を入力してください。"); return false; } if (function.checkNull(file)) { //文章のみの登録 dao.posting(text, address, penName, "noImage.jpg"); return true; } if (function.checkJPG(file)) { //画像のみor文章・画像の登録 ☆String fileName = function.getFileName(file); ☆function.uploadFolder(file, fileName); dao.posting(text, address, penName, fileName); return true; } function.addErrorMessage("画像はJPG形式の画像のみ使用できます。"); return false; }

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

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

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

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

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

guest

回答5

0

感覚の問題だから難しいですね。

uploadFolder()

他のクラスに書かれている処理に遷移するためのメソッド

と考えて作るから違和感があるのでは?

「ファイルをフォルダに登録する」
(もっと言えばその一連の処理に名前をつけたかった)
というのが目的で、
遷移(というか委譲)するのは手段です。

投稿2016/12/15 02:54

ozwk

総合スコア13521

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

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

0

ベストアンサー

「他のクラスに書かれている処理に遷移するためのメソッド」に違和感を感じているのですが、
皆様はこのようなメソッドを作成しているのでしょうか。

私もよくやりますが、処理を他のクラスやメソッドに「委譲」することは、
Javaのようなオブジェクト指向言語では常套手段です。使いこなすと便利です。

ただ、メリットが分かりにくいと思いますので日常でたとえると、パソコンの
内蔵ハードディスクを外付けにすると、交換しやすくて便利だというようなことです。
つまり、多少複雑になりますが、間接化すると柔軟になり、交換などしやすくなります。


論よりコードで、具体的に何が便利なのか見てみましょう。
たとえば、メソッドAという命名があまり良くないので、
メソッドBという名前にリファクタリングしたいとします。

しかし、開発の規模が大きい場合、いきなり名前を変えると、
ほかのあちこちでエラーが出まくって大変なので、
後でバージョンアップするまで、新旧メソッド名の互換性を保ちたいとします。

こういう場合、どう書けばいいでしょうか? 非常にシンプルなやり方があります。
そう、委譲です。

Java

1class Sample { 2 public static void main (String[] args) { 3 methodA(); 4 methodB(); 5 } 6 7 static void methodA () { 8 methodB(); 9 } 10 11 static void methodB () { 12 System.out.println("methodB"); 13 } 14}

上のサンプルコードのように、メソッドAはメソッドBへ処理を委譲します。
すると、メソッドAでもBでも実際の処理はBになり、互換性が実現します。
(上は同じクラスですが、別クラスでもオブジェクトを参照すれば委譲できます)

そして、メソッドAを非推奨にして、だんだんコード中の記述を減らしていき、
あとで(メジャー)バージョンアップ時にメソッドAを消せば、スムーズに移行できます。


ここで別の見方をすると、「高凝集・疎結合」を目指すのが筋の良いプログラミングですが、
委譲は疎結合を実現するひとつの手段です。そもそも間接化と疎結合は似たようなところがあります。

また別の視点で見ると、上は単純な例でしたが、もっと複雑で高度な間接化が、
やはりJavaではおなじみの「デザインパターン」です。

たとえば、「アダプターパターン」などは上の発展的なパターンですね。
ちなみに、外付けハードディスクを着脱するためにUSB(ケーブル)を使いますが、
そういう通信機器には文字通りのアダプターもあるので、イメージしやすいでしょう。

それからもちろん、質問者の方がおっしゃっている、
小さなメソッドにする、というのも目的のひとつです。

というか、クラスやメソッドが肥大化すると、低凝集・密結合になりやすいので、
これは同じことを別の角度から見ている面があります。


ただ、デメリットもあります。メリットは柔軟性ですが、デメリットは複雑性です。
委譲を多用すると、とくに慣れるまでは、オブジェクト指向迷路ができてしまい、
たらい回しみたいにあっちこっちに振り回されて、うんざりするかもしれません。

それでも、デザインパターンを学ぶなどしながら試して使いどころを覚えていくと、
ゆくゆくは快適に組めるようになります。もし最初は上手く行かなくても、
長い時間をかけて少しずつスタイルを変化させていくのがオススメです。

投稿2016/12/15 12:31

編集2016/12/15 12:40
LLman

総合スコア5592

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

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

0

あくまでも私見ですが…
メソッドを作る理由を「1クラスの1メソッドを極力少なくするため」だったり「他のクラスに書かれている処理に遷移するため」だと思うと、違和感があるのかもしれません。私自身はそのような発想でメソッドを作る事はあまりありません。
そうではなく、メソッドの役割に着目して考えれば見え方は違ってくる気がします。

まず、uploadFolderメソッドを作った目的としては、「投稿された画像をアップロードしてファイル名を変換する事」だとします。一方、上記のコードを見て想像するとpostingというメソッドは「投稿された内容の形式が正しいかどうかチェックする」という役割を担っていますよね。ここで、uploadFolderを使わずにposting内で同様の処理をする事は、当然、可能です。1つのclass、1つのメソッドで完結する処理であれば問題は無いかもしれません。
しかし、例えば同じclass内の別のメソッドで「投稿された画像をアップロードしてファイル名を変換する事」をしたい。でも、エラーチェックの内容はちょっと違う。という時には、どうしましょうか?という事です。
これが別のメソッドとして切り出されていれば、これを再利用することは出来ますよね。役割が単純であればこの様な再利用をしやすくなります。前述の様な理由で、uploadFolderは存在しているのではないでしょうか。

ちなみに、「1クラスの1メソッドのコード量」は、1つのメソッドが複数の役割をこなしていないか、という一つの目安になっていると思います。単純な役割をこなすだけなのに、そんなに多くのソースを書く理由は…?という事だと思います。

投稿2016/12/15 02:14

motuo

総合スコア3027

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

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

0

オブジェクト指向に基づき、メソッドの連携やクラス同士の関係を意識しながら作るとよいかもしれません。
Javaでは、Facadeパターンというデザインパターンがあります。Facadeパターンは、大きなプログラムを作って複雑な処理を行う場合に、「窓口」のような役割のクラスを設置して、呼び出しなどの処理を委託するデザインパターンです。今回の場合は、メソッドの話ですが、これにも応用できると思います。あまり詳しいことはわかりませんがご参考までに。

投稿2016/12/17 13:23

編集2016/12/17 13:25
hidemaru

総合スコア30

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

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

0

自分はjavaは特にクラス間メソッド間の連携を重視した、オブジェクト指向言語だと教わっているので、
「他のクラスに書かれている処理に遷移するためのメソッド」に対しても特に違和感を感じることは少ないですね、よっぽど歪な構成でなければ

自分自身初心者なのであまり偉そうなことはいえませんが、最初のうちは特に多様な考えに触れて吸収するためにも、最初は「こういう設計・考え方もあるんだな」程度に受け取っておけばいいかなと思います

投稿2016/12/15 02:26

luna12

総合スコア47

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問