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

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

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

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

Q&A

解決済

2回答

1887閲覧

オブジェクト指向的な構文を知りたいです。

yahhymmne

総合スコア20

Java

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

2グッド

0クリップ

投稿2016/08/30 05:30

###前提・実現したいこと
プログラム自体は問題なく動作します。
時間/分/秒を入力してもらい、指定した時間に近づく度にアラームを鳴らすという機能です。
(文字列表示だけですが、文字列を他のプログラムへコピペする動作が入るので問題ありません。)

Class,Methodをどの程度分類すれば良いのか、
このコードはこのファイルに移したほうがいい、
新しくClass,Methodを作る、または削除するべき等、
理由を含めた様々な指摘を頂きたいと思い、こちらへ質問させて頂きました。
ご回答よろしくお願いします。
###該当のソースコード

Java

1Main.java 2 3import java.io.IOException; 4class Main 5{ 6 public static void main(String[] args) throws IOException 7 { 8 AskSecond asksec = new AskSecond(); //インスタンス生成 9 int keisuu = asksec.timeCase(); //係数を取得 10 int second = asksec.askSecond(keisuu); //timeCase,askSecondメソッドを実行 11 Output result = new Output(); //インスタンス生成 12 result.OutputFunc(second); //secondをOutputFuncメソッドに送る 13 } 14 15}

Java

1AskSecond.java 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6 7class AskSecond 8{ 9 BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); //リーダーの作成 10 11 int timeCase() throws IOException //例外の時に投げるように 12 { 13 byte unit = 0; //変数宣言 14 int keisuu = 1; 15 16 System.out.println("指定した残り時間が20,10,5,3,1分になるとアラームを鳴らすためのコマンドを表示します。" 17 + "\n単位を「1:時間,2:分,3:秒」のいずれかの数字で答えてください。"); 18 System.out.print("単位:"); 19 20 unit = Byte.parseByte(br.readLine()); //選択肢入力 21 if (unit == 1) keisuu = (3600); //時間なら60*60=3600倍 22 if (unit == 2) keisuu = (60); //分なら60倍 23 if (unit == 3) keisuu = (1); //秒ならそのまま 24 25 if (unit <1 || unit > 3) //エラー 26 { 27 System.out.println("不正な値です。もう一度入力してください。"); 28 keisuu = timeCase(); //不正な場合もう一度メソッド呼び出し 29 } 30 31 return keisuu; 32 33 } 34 35 int askSecond(int keisuu) throws IOException //例外の時に投げるように 36 { 37 double time = 0.0; 38 39 System.out.println("指定する時間を入力してください。"); 40 System.out.print("時間:"); 41 42 time = Double.parseDouble(br.readLine()); //選択肢入力 43 double second = time*keisuu; //秒数へ補正 44 45 return ((int)second); //Mainに秒数を送る 46 47 } 48 49}

Java

1Output.java 2 3class Output 4{ 5 Output() 6 { 7 System.out.println("結果を出力します。1行ずつコピー,ペーストをしてください。"); 8 } 9 10 void OutputFunc(int second) 11 { 12 NegaSec negasec = new NegaSec(); 13 Title title = new Title(); 14 for(int i=0;i<title.notice.length;i++) 15 { 16 if (second + negasec.cases[i]<=0) return; //0秒以下のものを表示する前に終了させる 17 System.out.println("[アラーム発生:(全員)]:./sound/" + title.notice[i] + 18 ".mp3:" + (second + negasec.cases[i]) + "秒後"); 19 } 20 } 21}

Java

1NegaSec.java 2 3class NegaSec 4{ 5 final int[] cases = {0,-60,-180,-300,-600,-1200}; 6}

Java

1Title.java 2 3class Title 4{ 5 final String[] notice = {"alarm","left1","left3","left5","left10","left20"}; //再生するファイル名を残り時間昇順に書く。 6}

###補足情報(言語/FW/ツール等のバージョンなど)
JavaSE-1.8
Eclipse Neon使用

yuba, LLman👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

オブジェクト指向的な構文を知りたいです

「構文(OOPに相当するでしょうか)」だけでなく、
「分析(OOA)」「設計(OOD)」も重要になってきます。

もっと言えば完全な事前設計は難しいので、オブジェクト指向は、
リファクタリングを通じて、過程として実現していくものです。

しかしそれではキリがないので、具体的にひとつ指摘してみます。


java

1class AskSecond

私でしたらまず、「AskSecond」クラスを、
「Ask」クラスと「Second」クラスに分解します。
(クラスの命名とか細かいことは、ここでは省略します)

ユーザからの「入力」と「時間」を扱うという、
ふたつの責務をひとつのクラスで同時にやってしまっています。

「単一責任の原則(SRP)」というのもあるので、
ひとつのクラスはひとつの責務を持つのが原則です。

Class,Methodをどの程度分類すれば良いのか

だから、分類の基準は単一の責務を割り当てることです。
行数なども粒度の目安にはなりますが、基本は責務です。


まあ現状では分割による違いをあまり実感できないかもしれませんが、
販売するようなソフトを作るときは、競争力を持つ機能が必要なので、
今の百倍、千倍、万倍の規模になります。そのとき効果を発揮します。

そういう未来の状態を予測するのが分析であり、
未来の変化に対応できるようにするのが設計です。

たとえば、今のコードが将来的には「タイマーもついたスケジューラ」になるとか。
そうなると、入力も時間も複雑になります。たとえば、うるう年の判定とか。
「Second」クラスでうるう年の判定をするとカオスだから、「Year」でやろうとか。

ただ人間は未来を完全に把握しきれません。
未来ではクラスが千個必要だとしても、それをいま全部書き出すのは難しい。

だから、クラスの再設計は一回やったら終わりではなく、
生物の細胞分裂のように、継続的にリファクタリングしていくのが理想です。

投稿2016/08/30 08:06

LLman

総合スコア5592

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

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

yahhymmne

2016/08/30 14:30

回答ありがとうございます。  なるほど、一つのプログラムを作って完成、ではなく継続的に手直しするのが重要なのですね。「分析(OOA)」「設計(OOD)」も重要という回答は目からうろこです。  初耳でした、単一責任の原則についてもWebで調べさせて頂きました。 『変更する理由が同じものは集める、変更する理由が違うものは分ける』 というのを言い換えると、 『変更内容が違うのに同じファイルを弄るようなことを避ける』とも言えるのでしょうか。 意識して取り組むように気をつけます。 人間は未来を完全に把握しきれないので、はじめの段階で全てを書き出すことは考えなくていい、と捉えました。(最初の時点で完璧を求めていたら永遠に実装出来ませんよね。) ただ、何度も手を重ねてその完璧に近づくことが出来る、それがオブジェクト指向なのだと回答を見て感じました。  貴重な回答ありがとうございました。
guest

0

(これは質問への直接的な回答ではありません。現時点でついている LLman さん回答を支持します。)

オブジェクト指向的な構文を知りたいです。

狭い意味で捉えれば、オブジェクト指向的な 構文 というものは存在しません。LLmanさん回答にあるように、オブジェクト指向は「分析 (OOA; Object-Oriented Analysis)」や「設計 (OOD; Object-Oriented Design)」の領域で適用されるものです。オブジェクト指向プログラミング(OOP; Object-Oriented Programming)は、これらの分析・設計に基づいて行われるプログラムの実装技法です。たとえば、C言語でOOPを行うことも可能です。

Java言語の場合、OOPを サポートする(=簡単に記述できるようにする) 構文がいろいろと提供されます(例:classprivateによるカプセル化、extends/implementsによる継承など)。広い意味では、Java言語の構文ほぼ全てがオブジェクト指向"的な"構文といえるかもしれません。

投稿2016/08/30 11:26

編集2016/08/30 11:29
yohhoy

総合スコア6191

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

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

yahhymmne

2016/08/30 14:39

 OOPはOOA・OODに基づく実装技法、ですね。肝に銘じておきます。 CでもOOPが出来るというのは少し意外でした。構文のサポートが他のオブジェクト指向言語とくらべて少ないだけで、頑張れば出来るものなのですね。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問