araharu
@araharu

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java

Q&A

Closed

・前書き

0

2Answer

そもそもIndicator側だけでエラー処理するのではだめなのでしょうか?
出力処理が分散されてる設計があまり良くないと思います。

  • 例外をcatchせずに上位に投げる
  • boolean返すようにして成功可否を渡す
  • 出力処理を全部readFile中で行う

辺りが手軽な対応方法でしょうか
どれも要件からは微妙に外れてしまいそうですが

個人的にはreadFileというメソッド名と実装がマッチしてないのが気持ち悪いです。
自分でしたらreadFileでは二次元のList作ってオブジェクトを返すようにしてようにして、表示処理はdisplayFileで行うようにしますかね。(そもそもこういう単位でclass分割しませんが)

1Like

Comments

  1. @araharu

    Questioner

    @ligun 様、回答ありがとうございます。

    >>そもそもIndicator側だけでエラー処理するのではだめなのでしょうか?
    これは、クラスを分けない方がいい、という意味でしょうか?(初心者なのでうまく意味を受け取れていなかったらすいません m(> <)m)
    ここに載せているコードは本来のコードを簡潔に書いたもので、本来はもっと長いコードとなっています。なのでクラスを分けた方がいいかなと思い「読み込み」と「表示」で分けているのですが、確かに一緒でもいいような気がしますね。

    >>どれも要件からは微妙に外れてしまいそうですが
    すいません、ここの文章も私の勉強不足故、どういう意味か理解できませんでした m(> <)m

    >>個人的にはreadFileというメソッド名と実装がマッチしてないのが気持ち悪いです。
    readFile()はファイルを読み込んでいるメソッドなのでそう命名したのですが、どうおかしいでしょうか。教えてくださると幸いです m(> <)m

    勉強不足故変なことを聞いていたらすいません m(> <)m

  2. readFile()はファイルを読み込んでいるメソッドなのでそう命名したのですが、どうおかしいでしょうか。教えてくださると幸いです m(> <)m

    すみません、こちらは自分の勘違いでした。
    // ここにファイルの内容をリストにするコードを書き込む。 のコメントを「ファイル内容を表示する」と勘違いしたことによるものでした。
    質問を見直したところ自分がコメントした内容と同じくリスト生成と表示は分離されていました。
    混乱させてしまい申し訳ございません。

    これは、クラスを分けない方がいい、という意味でしょうか?(初心者なのでうまく意味を受け取れていなかったらすいません m(> <)m)

    設計ややりたい内容にもよるのであくまで自分の場合ですが、データを取得するのも表示するのも同じデータに対する操作なので、データを扱うクラスが合ってそれに対するloadメソッドとdisplayメソッドがあれば十分かなと思いました。

    Javaしばらく書いていないのとIDE通してないので多分色々と間違ってそうですが、下記のような感じでどうでしょうか?
    (詳しい人にマサカリ投げられそう)

    public class CsvData {
        private List<List<String>> data;
        private CsvData() {}
    
        static CsvData load(String path) throws IOExecption {
            var csvData = new CsvData();
            //CSVファイルを読んでdataに格納する
        //...
            
        //生成したオブジェクトを返す
            return csvData;
        }
    
        void display() {
            //dataを出力する処理
        }
    }
    
  3. すいません、ここの文章も私の勉強不足故、どういう意味か理解できませんでした m(> <)m

    これは単に元々の質問の要求ですとFileReader側だけで処理したいとのことでしたが、自分の案だとIndicator側で処理してたり出力処理の場所を変更してたりする提案をしたので、厳密に言えば要求にあっていないなということでした。

最初に指摘しておきますが,標準ライブラリと同じクラス名を意図的につけることは推奨しません.記述によってコンパイラの誤作動やIDE上での誤補完を起こしやすいため,自作したクラスには区別可能な名前をつけてください.

以下,質問文中のFileReaderなるクラスをTableDataReaderとでも呼称して回答します.

そもそもの話なぜIndicator側で処理を中断できないかについてですが,単純に呼び出し側でそれを知る術がないためです.
ではTableDataReaderで生じたエラーをどう呼び出し側に知らせるか?「例外をそのままthrowsしてしまう」方法と「メソッドがnullとかの適当な返値を返す」方法があります.

結構設計に左右される部分ですので,察するにあんまりオブジェクト指向的な書き方ができない初学の段階で変な癖をつけてしまうと,あとでエライ目を見ますので現状からどっちがいいとかは個人的にはあんまり言えません.
これを検討するのは,もう少しデータモデルの考え方を習得してからでもよいです.

少なくとも,なんでもtry-catchで解決しようとしないでください.

0Like

Comments

  1. @araharu

    Questioner

    @Verclene 様、回答ありがとうございます。
    クラス名のFileReaderについてですが、本来区別できるよう命名していたのですが情報保護のため名前をQiita用に変える際に失念しており標準ライブラリと同じ名前にしてしまっていました、失礼しました m(> <)m
    ご指摘ありがとうございます。

    お察しの通り、オブジェクト指向的な書き方の習得に難航しております。。。
    「例外をそのままthrowsしてしまう」というのはエラーを起こすという意味でしょうか?
    ユーザーが使う以上エラーは基本的にcatchするべきなのではと思うのですがそんなことはないのでしょうか?(初心者故的外れなことを言っていればすいません、、)

    今の所、TableDataReaderのときにcatchにならなければ最後にフィールドのArrayListに格納するようにしており、catchに引っ掛かればArrayListに格納ができずNullになるので、Indicatorの時にif文でArrayListがNullの場合returnを返すようにして対応しております。

  2. 「例外をそのままthrowsしてしまう」というのはエラーを起こすという意味でしょうか?
    ユーザーが使う以上エラーは基本的にcatchするべきなのではと思うのですがそんなことはないのでしょうか?

    Javaにはthrows宣言というものがありまして,用途は調べていただければと思いますが,要はこのメソッドはこのエラーを吐くかもしれんから使用者の責任で対処しろという宣言ができます.

    まずここでいう「使用者」とはユーザーのことではなく,メソッドから見てそれを呼び出す側のことをやむを得ずそう呼称しています.詳しく解説するより,抽象化について理解が深まってからのほうがイメージしやすいと思われますので,細かい話は割愛しますが,「どこで異常に対処するかによってもクラスの役割が変わってきてしまう」という話だと思ってください.

    ソフトウェアのユーザー目線の話は一旦忘れておいていいです.そこは別の設計の話になりますので,あんまり細かいこと言うと初学者にはまだしんどいですし,ポートフォリオ程度どうせログ吐いて終わりですんで…

Your answer might help someone💌