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

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

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

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

意見交換

3回答

625閲覧

java 添削求む これからについて

shuoga

総合スコア2

Java

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

1グッド

0クリップ

投稿2025/01/25 11:15

背景、状況

mistral aiに500行ぐらいのプログラムになる問題を作って欲しいといったときのaiの回答を元に練習しました。以下aiの生成した練習問題です。

問題1: 図書館管理システム

要件

  1. 図書クラス:

    • タイトル、著者、ISBN、貸出状況を持つ。
    • 貸出状況を変更するメソッド。
  2. ユーザークラス:

    • ユーザーID、名前、貸出中の図書リストを持つ。
    • 図書を貸出・返却するメソッド。
  3. 図書館クラス:

    • 図書リスト、ユーザーリストを持つ。
    • 図書の登録、貸出、返却、検索機能を持つメソッド。
  4. メインクラス:

    • ユーザーインターフェースを提供し、図書館の操作を行う。

詳細

  • 図書の登録時には、タイトル、著者、ISBNを入力し、図書リストに追加。
  • 図書の貸出時には、ユーザーIDと図書のISBNを入力し、貸出処理を行う。
  • 図書の返却時には、ユーザーIDと図書のISBNを入力し、返却処理を行う。
  • 図書の検索時には、タイトルや著者で検索できる。

プラスで僕がいくつかクラスを追加しました。
ScannerUtilクラスを作った理由は改行処理と了承を得るため、isbnのチェックメソッドが入っています。patternと13桁目の桁チェック両方しました。
それからFrontクラスについては上記の通りです。

コード

肝心のコードですが、teratailの仕様で9000文字しか質問できないためgithubのurlを貼ります。お手数をおかけしますってかterateailが悪いですよね。あとコード内のコメントアウトはなぜか拙い英語で書かれています。別に日本語が使えない環境ではないです。javaのバージョンは21だと思います。ちなみにintellij idea使ってます。
https://github.com/shuoga4/testjava

テーマ、知りたいこと

もしかして、public final type variableは、stringなどの型の場合private + getterと同じですかね?Bookクラスを作るとき最初は手癖でフィールドをプライベートにしましたが、あとからパブリックにしました。結局

Book class内のOptional以外の解決方法。一応強制返却機能も設けたが、これだとUserが多くなると処理が重くなりそうで、Book内に誰が借りてるかの情報が欲しかったので、なにか代替案あれば教えて下さい。一応あとからid保存するだけでいいんじゃね?とは思いました。

現在classを作る理由がそのほうがきれいだから、以外に理由が無いです。カプセル化とかポリモーフィズムをあまり理解していない、一応設計の本は買ったがまだ読んでいません。まだそんなレベルでは無い気がして。

フィールドをプライベートにするのもなんとなくプログラマーっぽいのでやっています。もちろんレンジは意識していますが。

フロントがmainから直接アクセスされるクラスで、基本的にFrontから他のクラスにアクセスする。mainメソッドがごちゃらないほうがかっこいいから。
Frontからしか他のクラスにアクセスできないように明示とかできるんですかね?

これから

実はjava始めたのはminecraftのmodを作りたかったからです。ありふれた理由ですが。一応javaのオラクル認定試験のgold買って、残りの知らない構文とかを勉強したあとは、一番最初のminecraftのバージョンであるclassicを0から自分で作れたらいいなと思っています。そこで、なにかおすすめのサイトなり本なりあったらお願いします。
逆にみなさんがどういう職についてどうjavaを使っているのか気になります。やっぱ企業が使うソフトを作るのがメインなんですかね?システムエンジニアの定義があんまりわかっていません。逆に僕がシステムエンジニア目指そうと思ったらここから何を学ぶのかも気になります。
全部の質問に回答しなくても良いので好きなのだけ回答してください。

juner👍を押しています

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

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

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

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

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

回答3

#1

jimbe

総合スコア13286

投稿2025/01/26 05:51

編集2025/01/26 06:09

大き目のプログラムを作ってみたいというのなら、 CUI でメモリ内でこじんまり自己完結するようなのでは無く GUI でインターネット・ファイル・DB を使うような、例えば自分専用のメールソフトを仕様から全て自分で決めて作るとかすればすぐ大きくなりますよ。
そのほうが新しいことの勉強にもなるでしょうし、上手くすれば自身で日常的に使うことも出来るかもしれません。
もちろんいきなり outlook レベルに挑戦するのは無謀でしょうが、まずは GUI だけ次にメールサーバに接続だけ次に一覧受信だけ…とステップアップすればいいわけですし。

本件の仕様は、一番メインである図書の貸し出し状況が図書とユーザしかも両方にあるのは良いようには思えません。
"貸し出し"というのは"図書"本来の属性でも"ユーザ"本来の属性でも無く、"図書館"での関連付け機能として存在するもののように思います。

出力部分で何か古いサブシステムを参考にされているような構造が見受けられます。入力部分も含めてその構造(UIサブシステム?)を別クラス・ライブラリ化出来れば Front とか ScannerUtil とかメニューとかレザルトとかごちゃごちゃした状況を整理出来るかもしれません。

java 等のオブジェクト指向は、何等かの塊(データとか処理とか)を見出して纏めるのがキモです。
ISBN は独自の構造・制限を持つ文字列として単独のクラスにしたほうが "格好良い" のではないでしょうか。
たとえば以下のようにすると ISBN isbn = ISBN.of("978-1408855652"); とかでコードに問題が無ければ ISBN オブジェクトが出来、問題があれば null になります。

java

1class ISBN { 2 private static final Pattern PATTERN = Pattern.compile("([0-9]{13})|([0-9]{9}[0-9X])"); 3 static ISBN of(String text) { 4 Matcher m = PATTERN.matcher(text.replaceAll("[ -]","")); 5 if(!m.matches()) return null; 6 7 if(m.groupCount() == 3) { //ISBN-10 8 String code = m.group(2); 9 int v = 0; 10 for(int i=0, j=10; i<9; i++, j--) v += Character.digit(code.charAt(i), 10) * j; 11 v += code.charAt(9)=='X' ? 10 : Character.digit(code.charAt(9), 10); 12 if(v%11 == 0) return new ISBN(code); 13 14 } else { //ISBN-13 15 String code = m.group(1); 16 int v = 0; 17 for(int i=0, j=1; i<13; i++, j^=2) v += Character.digit(code.charAt(i), 10) * j; 18 if(v%10 == 0) return new ISBN(code); 19 } 20 21 return null; 22 } 23 24 private final String code; 25 26 private ISBN(String code) { 27 this.code = code; 28 } 29 30 @Override 31 public int hashCode() { 32 return Objects.hash(code); 33 } 34 35 @Override 36 public boolean equals(Object other) { 37 if(other == this) return true; 38 if(other == null || !(other instanceof ISBN)) return false; 39 ISBN o = (ISBN)other; 40 return o.code.equals(this.code); 41 } 42 43 @Override 44 public String toString() { 45 return new StringBuilder(getClass().getSimpleName()) 46 .append("@").append(Integer.toHexString(hashCode())) 47 .append("[code=").append(code) 48 .append("]").toString(); 49 } 50}

equals() を override するなら hashCode() も override してください。

toString() の結果を UI に使うのは止めたほうが良いです。(toString は基本的にはデバッグ用です。)

メニューや ISBN の処理等にバグがあります。

以下は Pattern を使う意味がありません。

java

1public List<Book> searchBookByTitle(String title){ 2 Pattern p = Pattern.compile(".*" + Pattern.quote(title) + ".*"); 3 List<Book> resultList = new ArrayList<>(); 4 for(Book book : bookList){ 5 Matcher m = p.matcher(book.title); 6 if(m.find()) resultList.add(book); 7 } 8 return resultList; 9}

String#contains やついでに Stream を使うと以下で済みます。

java

1 return bookList.stream().filter(book -> book.title.contains(title)).toList();

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

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

#2

irrvgkus01

総合スコア3

投稿2025/01/29 13:37

実際に500行程度のPGお作るという行動はとても素晴らしい行動力です。
コードについて思ったこと1つだけあげるとすれば、

ユーザーインターフェースを提供し、図書館の操作を行う。

とありますが、CUI表示しかなさそうなので、GUIがないと管理者側しか操作できないという問題があります。
ちなみに今回の要件で明示されていませんが、1ユーザーが何をどれだけ借りたか 2図書館に何の本があるか
はデータベース(DB)が管理するのがよくあるため、ユーザーが本がたくさんあっても重くなるのはほぼなくなります。

実はjava始めたのはminecraftのmodを作りたかったからです。

と書かれていますので、よく使う機能についてまとめられていると評価せれてる本を買い、
まずはそれを作ってみて、それからオリジナルのものにステップアップがおすすめです。
ゲームの裏側で起こっていつことざっくり知りたい場合はyoutube[猫でもわかるUE](Unreal Engine公式のやつhttps://www.youtube.com/live/ztv4OPc_o6g?si=LnZkEQABeicJSWjq)

逆にみなさんがどういう職についてどうjavaを使っているのか気になります。

私はjavaより、データベースを触る役割が多いですが、既存のくそでかシステムに対する小さな改修や、新規システムの導入に向けた準備や不具合確認などなどが多いです。javaはspringboot(フレームワーク)が使われています。
システムエンジニアにいち早くなりたい場合は現場経験が一番大事なので、即就職活動するのがおすすめです。今のマイクラの勉強のほかに、springbootを理解して扱えるとかなり大きなアピールポイントにはなると思います。

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

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

#3

jimbe

総合スコア13286

投稿2025/01/31 13:52

編集2025/01/31 14:02

#1 の ISBN クラスの ISBN10 判定が間違っていたので修正・ついでに toISBN13 メソッド追加。

java

1class ISBN { 2 private static final Pattern PATTERN = Pattern.compile("([0-9]{13})|([0-9]{9}[0-9X])"); 3 private static final String ISBN10_ELEMENTS = "0123456789X"; 4 5 static ISBN of(String text) { 6 Matcher m = PATTERN.matcher(text.replaceAll("[ -]","")); 7 if(!m.matches()) return null; 8 9 if(m.group(2).length() > 0) { //ISBN-10 10 String code = m.group(2); 11 int v = 0; //mod11wait10-2 12 for(int i=0; i<10; i++) v += ISBN10_ELEMENTS.indexOf(code.charAt(i)) * (10-i); 13 if(v%11 == 0) return new ISBN(code); 14 15 } else { //ISBN-13 16 String code = m.group(1); 17 if(mod10wait3p1(code) == 0) return new ISBN(code); 18 } 19 20 return null; 21 } 22 23 private static int mod10wait3p1(String s) { 24 int v = 0; 25 for(int i=0, j=1; i<s.length(); i++, j^=2) v += Character.digit(s.charAt(i), 10) * j; 26 return v % 10; 27 } 28 29 final String code; 30 31 private ISBN(String code) { 32 this.code = code; 33 } 34 35 ISBN toISBN13() { 36 if(code.length() == 13) return this; 37 String s = "978" + code.substring(0,9); 38 return new ISBN(s + ((10-mod10wait3p1(s))%10)); 39 } 40 41 @Override 42 public int hashCode() { 43 return Objects.hash(code); 44 } 45 46 @Override 47 public boolean equals(Object other) { 48 if(other == this) return true; 49 if(other == null || !(other instanceof ISBN)) return false; 50 ISBN o = (ISBN)other; 51 return o.code.equals(this.code); 52 } 53 54 @Override 55 public String toString() { 56 return new StringBuilder(getClass().getSimpleName()) 57 .append("@").append(Integer.toHexString(hashCode())) 58 .append("[code=").append(code) 59 .append("]").toString(); 60 } 61}

コードに何かあった時に意見が伸びるのもアレなので全体を GitHub に入れておきます。
https://github.com/Jimbe-github/q_2ny9h6towvq1p7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問