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

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

ただいまの
回答率

90.46%

  • Java

    16235questions

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

  • オブジェクト指向

    332questions

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

オブジェクト指向に対応できているのか

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 339

lianprivate

score 13

現在JavaとDBの連携を学習しております。そこで3つのテーブルを操作し、挿入、更新、検索、削除等を行える段階まで来ましたが、オブジェクト指向の考え方に沿うべくクラスやメソッドの役割を調整している段階です。

1つのテーブルに対して新しい列を挿入するという事をオブジェクト指向に寄せて作ってみました。
というのも、以前まではsetter、getterを利用してデータの受け渡しを実施していたのですが、初めて別の方法、今回はArrayListでのデータ受け渡しを実施しました。
そこでこのArrayListでのデータ受け渡しの方法がこの方法で問題が無いのか。また、他にこういうやり方があるという事や、ArrayListであればこのやり方の方がベターだよというやり方があるのであれば是非ご教授頂きたいのです。

また別の質問として、ArrayListはStringからint変換する際にparseIntは使えないのでしょうか? DBパラメータのAgeはIntegerのカラムですが、ひとまず動作する事を目標にしたので、そのままStringでDBへの挿入をし成功したのですが、いつかエラーが出そうで心配です。 自分で思いついたのはString型の変数にひとまず代入して、そこからint型の変数にparseIntで代入するというやり方ですが、とてつもなく不格好であると自覚できるような状態です。
こちらは既に回答頂き、解決致しました。

ひとまず、作成したコードを記載致しますので、ご指摘頂ければ幸いです。宜しくお願い致します。

public static void register() throws SQLException {
        Regist regist = new Regist();
        ArrayList<String> reg = new ArrayList<String>();
        System.out.println("名前を入力してください");
        reg.add(sc.next());
        System.out.println("年齢を入力して下さい");
        reg.add(sc.next());
        System.out.println("住所を入力してください");
        reg.add(sc.next());
        System.out.println("性別を入力して下さい");
        reg.add(sc.next());
        reg.add(Integer.toString(regist.getDbUser()));
        Insert insert = new Insert();
        insert.InsertDB(reg);
}


public void insertDB(ArrayList reg) throws SQLException {
        PreparedStatement stmt = null;

        DBConnection dBConn = new DBConnection();
        Connection conn = dBConn.dBConn();

            if((reg.get(reg.size()-1)).equals("1")) {
                User user = new User();
                stmt = (PreparedStatement) user.userInsert(stmt, reg, conn);
            }else if((reg.get(reg.size()-1)).equals("2")) {
                Privacy privacy = new Privacy();
                stmt = (PreparedStatement) privacy.privacyInsert(stmt, reg, conn);
            }else if((reg.get(reg.size()-1)).equals("3")) {
                OtherInfo otherInfo = new OtherInfo();
                stmt = (PreparedStatement) otherInfo.otherInfoInsert(stmt, reg, conn);
            }
            stmt.executeUpdate();
            conn.commit();
            if(stmt != null)stmt.close();
            if(conn != null)conn.close();
    }

public Connection dBConn() {
        Connection conn = null;

        //接続文字列
        String url = "jdbc:postgresql://localhost:5432/sample";
        String user = "postgres";
        String password = "sample";

        try {
            Class.forName("org.postgresql.Driver");


        //PostgreSQLへ接続
        conn = DriverManager.getConnection(url, user, password);

        //自動コミットOFF
        conn.setAutoCommit(false);
        } catch (ClassNotFoundException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        return conn;
    }

public Statement userInsert(Statement stmt,ArrayList reg,Connection conn) throws SQLException {
        String sql = "INSERT INTO m_user VALUES (?,?,?,?,current_timestamp)";
        stmt = conn.prepareStatement(sql);
        ((PreparedStatement) stmt).setString(1,(String) reg.get(0));
        //下記のStringを本当はintで値をセットしたい。
        ((PreparedStatement) stmt).setString(2,(String) reg.get(1));
        ((PreparedStatement) stmt).setString(3,(String) reg.get(2));
        ((PreparedStatement) stmt).setString(4,(String) reg.get(3));
        return stmt;
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/12/21 22:50

    この質問のゴールが不明です。やろうと思えばどこまででもできるし、現場や好みでも違います。意図通り動いていればとりあえずそれでいいという考え方もあります。
    デバッグ依頼となれば非推奨にもなりえますし。
    メソッドだけしか提示されてませんのでなんの判断もできません。
    もっとアドバイスもらいたいことをしぼってもらった方が良いかと思います

    キャンセル

  • mts10806

    2018/12/21 22:53

    「正しい」は「仕様通り要件通り動くこと」です。プロの目線はあくまで要件を満たすかに終始します。
    「完全無欠のコードを書ける人」ではありません。正解がない以上は落とし所を明確にしないとこの質問は解決に向かわないと思います。
    ※前の私の回答も具体的なことは何も書いてません。あくまで考え方のみです。そこで察してもらいたかった…

    キャンセル

  • lianprivate

    2018/12/25 09:36

    mts10806さん、返信遅くなり申し訳ございません。
    確かに曖昧であった部分失礼致しました。
    今回一番知りたかった事は、教科書通りに作成していくとgetter、setterでの値の受け渡しが行われる訳ですが、今回初めてそれらを使用せずArrayListでのデータ受け渡しを実施しました。
    その方法を用いてのやり方として今回のコードが正しい方法だったのかを知りたいというのが一番でした。本当はArrayListを使う場合、こういう方法がベターなんだよというのがあればご指摘頂ければ嬉しいというのが一点と、既に回答頂いたInttegerでのデータ引取方法を知りたかったという事です。
    書き方が曖昧になってしまっている旨、申し訳ございません。

    キャンセル

  • mts10806

    2018/12/25 09:38

    質問は修正できますので、調整願います。

    キャンセル

回答 4

checkベストアンサー

+1

いろいろありますが、

ArrayListで渡すことについて

これを正しく動かすためには名前年齢住所性別getDbUser()の順番で渡さないといけませんが、
違う順番であってもエラーは出てくれませんし、何が正しい順番なのかinsert()側に情報がありません。
なのでArrayListで渡すこと自体が一般的でないです。

regist.getDbUser()について

insertDB内でのregの使われ方を見る限り、regの末尾は"1","2","3"を想定しているはずです。
そのregの末尾はregist.getDbUser()で取得した値ですが、
getDbUser()という名前で"1","2","3"のどれか(多分"1")が返ることを予想できる人間は超能力者です。
もっと普通の人間に優しい名前をつけてください。

コードの抜粋の仕方について

よく読むと
User.userInsert()メソッドと
Insert.InsertDBメソッド、その他があることから
この質問文は責務がことなる(はず)の複数のクラスをメソッドだけ抜き出して
どのクラスのメソッドかを明記せずに全部一緒に書いてあると思います。
クラスごとの責務を重要視していればこのようなまとめ方をしないはずなので
もっと責務(このクラスは何をするためのクラスか)を意識しましょう。

Registクラスについて

以前の質問や使われ方を見る限りRegistはDBに入れる何かしらのデータなのでしょうが、
registだけではなんのデータかわからないし、
(意図的にぼかしているならsomeRegistとかfooRegistとか書くと、見ている側にその意図が伝わる)
registは名詞ではないのでクラス名として不自然だし、
そもそもregistなんて英単語は存在しません。

メソッド名について

User.insertUser()とか
DBConnection.dbConn()とか
クラス名とメソッド名がダブってます。

User.insert()とか
DBConnection.connect()でいいでしょ?

(Userがinsertするのか?という疑問は残ります。)

まとめ

もっと名前を真面目につけましょう。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/25 12:29

    ozwkさん
    わかりやすく回答頂いてありがとうございます!ArrayListを使うべきではない理由が良くわかりました。
    また名前についても納得できる指摘で非常に勉強になります。
    Registという単語が無い事も恥ずかしながら初めて知りました。
    もう一度名前を見直す所から作り直してみたいと思います。

    キャンセル

+1

オブジェクト指向は曖昧なところが私にはあるので、ソースで気になったところを上げます。

Insert insert = new Insert();
insert.InsertDB(reg);


クラスのインスタンスを作っていますが、同一クラスでしょうか?
ソースを見た限り、同一クラスなのでインスタンス化は要りません。

別クラスの場合、コンストラクタで何か設定をしているのなら別ですが、staticな引数だけなら
staticイニシャライザも使えます。

static
{
//  初期化
}

下記のStringを本当はintで値をセットしたい。

ということですが、2通りやり方があります。

ArrayList<Integer>


予めIntegerで最初から作る と、

arraylist.get( arg ).parceInt();


こうすると、parceIntが使えます。エラー処理を考えると結局ほぼ一緒なのですが。

あと、無理やりオブジェクト指向に口を出すと、私はこのように考えています。

・一つのサーバーにアクセスするなど(対象が変わらない)ものはstaticで、
・対象が異なる場合(ゲームのモンスターとか。)はオブジェクトを作る(staticなし)
とし、
・全てのもの(共通のことをする少し違うもの)はabstractを使用し、継承する。
・interfaceはあまり使わないのでパスで...

長々と書いてしまいましたが、こんな感じです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/25 09:38

    ご回答ありがとうございます。
    インスタンス化に関してはわかりにくく申し訳ないのですが、別クラスの為インスタンス化致しました。
    ただ、staticイニシャライザに関しては不勉強で初めて知りましたので、改めて学びたいと思います。

    またParseIntの方法も教えていただきありがとうございます!早速試してみたいと思います。
    あと、オブジェクト指向の考え方に関してもご教授頂きありがとうございます。もう一度コードを見直して改善できる事を探してみます!

    キャンセル

+1

全てのメソッドに、『何をしたいのか』という観点でコメントを書いてください。
プロのプログラマはそこを見て、コーディングを認識・評価します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/25 09:39

    ご回答ありがとうございます!
    コメントに関してはほとんど記述した事が無かったんで、意識して記述するようにしてみます!ご指導ありがとうございます!

    キャンセル

+1

オブジェクト指向について、まだ勉強中とのことですが、一般的とまではいわないかもしれませんが、
よくオブジェクト指向がわかる・わからないで話をするのは、オブジェクト指向設計です。

以前の回答でもクラス図を書いてとか、シーケンス図を書いてというのは、そのためです。

で、現状ではクラスがひとつの状態と思われるので、少なくともOODには、なっていないと思います。
また、OOPか?と質問されれても、それも違うと思いますし。
クラス(構造体)を使うところで、ArrayListを使う時点で、プログラマとしてもレベルは高くないと感じます。

以前まではsetter、getterを利用してデータの受け渡しを実施していたのですが、初めて別の方法、今回はArrayListでのデータ受け渡しを実施しました。

ArrayListを使う場合、こういう方法がベターなんだよ

??? 何をいっているのかよくわからない。
使い方というか、なぜ使うのかが理解できないなら、使わないほうがいいです。
今回のケースなら、配列のほうがまだマシだし。
オブジェクトの代わりとしてArrayListを使うなら、間違いなのでやめたほうがよい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/12/25 12:31

    momon-gaさん
    ご指摘ありがとうございます。
    ArrayListはただ言われるがまま、練習の為に使用したのですが確かに何故使うのかなど理解しないまま実施していました。
    クラスの役割などをもう一度熟考して作り直したいと思います。ありがとうございました。

    キャンセル

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

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

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

  • Java

    16235questions

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

  • オブジェクト指向

    332questions

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