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

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

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

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

オブジェクト指向

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

Q&A

解決済

4回答

1494閲覧

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

lianprivate

総合スコア23

Java

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

オブジェクト指向

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

0グッド

0クリップ

投稿2018/12/21 08:08

編集2018/12/25 00:46

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

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

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

こちらは既に回答頂き、解決致しました。

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

Java

1public static void register() throws SQLException { 2 Regist regist = new Regist(); 3 ArrayList<String> reg = new ArrayList<String>(); 4 System.out.println("名前を入力してください"); 5 reg.add(sc.next()); 6 System.out.println("年齢を入力して下さい"); 7 reg.add(sc.next()); 8 System.out.println("住所を入力してください"); 9 reg.add(sc.next()); 10 System.out.println("性別を入力して下さい"); 11 reg.add(sc.next()); 12 reg.add(Integer.toString(regist.getDbUser())); 13 Insert insert = new Insert(); 14 insert.InsertDB(reg); 15} 16 17 18public void insertDB(ArrayList reg) throws SQLException { 19 PreparedStatement stmt = null; 20 21 DBConnection dBConn = new DBConnection(); 22 Connection conn = dBConn.dBConn(); 23 24 if((reg.get(reg.size()-1)).equals("1")) { 25 User user = new User(); 26 stmt = (PreparedStatement) user.userInsert(stmt, reg, conn); 27 }else if((reg.get(reg.size()-1)).equals("2")) { 28 Privacy privacy = new Privacy(); 29 stmt = (PreparedStatement) privacy.privacyInsert(stmt, reg, conn); 30 }else if((reg.get(reg.size()-1)).equals("3")) { 31 OtherInfo otherInfo = new OtherInfo(); 32 stmt = (PreparedStatement) otherInfo.otherInfoInsert(stmt, reg, conn); 33 } 34 stmt.executeUpdate(); 35 conn.commit(); 36 if(stmt != null)stmt.close(); 37 if(conn != null)conn.close(); 38 } 39 40public Connection dBConn() { 41 Connection conn = null; 42 43 //接続文字列 44 String url = "jdbc:postgresql://localhost:5432/sample"; 45 String user = "postgres"; 46 String password = "sample"; 47 48 try { 49 Class.forName("org.postgresql.Driver"); 50 51 52 //PostgreSQLへ接続 53 conn = DriverManager.getConnection(url, user, password); 54 55 //自動コミットOFF 56 conn.setAutoCommit(false); 57 } catch (ClassNotFoundException e) { 58 // TODO 自動生成された catch ブロック 59 e.printStackTrace(); 60 } catch (SQLException e) { 61 // TODO 自動生成された catch ブロック 62 e.printStackTrace(); 63 } 64 return conn; 65 } 66 67public Statement userInsert(Statement stmt,ArrayList reg,Connection conn) throws SQLException { 68 String sql = "INSERT INTO m_user VALUES (?,?,?,?,current_timestamp)"; 69 stmt = conn.prepareStatement(sql); 70 ((PreparedStatement) stmt).setString(1,(String) reg.get(0)); 71 //下記のStringを本当はintで値をセットしたい。 72 ((PreparedStatement) stmt).setString(2,(String) reg.get(1)); 73 ((PreparedStatement) stmt).setString(3,(String) reg.get(2)); 74 ((PreparedStatement) stmt).setString(4,(String) reg.get(3)); 75 return stmt;

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

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

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

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

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

m.ts10806

2018/12/21 13:50

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

2018/12/21 13:53

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

2018/12/25 00:36

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

2018/12/25 00:38

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

回答4

0

ベストアンサー

いろいろありますが、

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 02:18

編集2018/12/25 02:39
ozwk

総合スコア13512

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

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

lianprivate

2018/12/25 03:29

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

0

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

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

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

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

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

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

投稿2018/12/25 02:00

momon-ga

総合スコア4820

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

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

lianprivate

2018/12/25 03:31

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

0

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

投稿2018/12/22 12:54

TetsujiMiwa

総合スコア1124

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

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

lianprivate

2018/12/25 00:39

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

0

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

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/21 09:57

編集2018/12/21 09:58
yukkuri

総合スコア624

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

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

lianprivate

2018/12/25 00:38

ご回答ありがとうございます。 インスタンス化に関してはわかりにくく申し訳ないのですが、別クラスの為インスタンス化致しました。 ただ、staticイニシャライザに関しては不勉強で初めて知りましたので、改めて学びたいと思います。 またParseIntの方法も教えていただきありがとうございます!早速試してみたいと思います。 あと、オブジェクト指向の考え方に関してもご教授頂きありがとうございます。もう一度コードを見直して改善できる事を探してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問