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

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

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

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

Q&A

解決済

2回答

715閲覧

beanに処理を書くことについて

tku_ab

総合スコア7

Java

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

0グッド

1クリップ

投稿2021/04/04 04:01

SpringBootとDomaを利用しシステム開発を行っています。
従事しているプロジェクトは5年以上前から開発が行われており、開発メンバーの入れ替わりが激しく重複した処理が度々作成されます。
また、誕生日等、日付を持つプロパティの型がLocalDateやDate、またはStringであったりとバラバラな状態で作られています。
また、今まで作られたUtilクラスもそれぞれの型用に作られています。
なので、システムの改修を行うときに、既存Utilクラスを使う様にすると、
内容によって膨大な量の型変換を行わなければならず、それだけで数十行も使ってしまい
業務ロジックが分かり辛くなってします。

そこで、型変換をgetter部分に纏めてしまおうと思うのですが、
これは、Javaの原則から言えば、良い処理といえるのでしょうか?

java

1import java.time.LocalDate; 2import java.time.format.DateTimeFormatter; 3public class Human { 4 LocalDate birthday; 5 public Human(LocalDate birthday) { 6 this.birthday = birthday; 7 } 8 public LocalDate getBirthday() { 9 return this.birthday; 10 } 11 12 // このメソッドは良いといえる処理ですか? 13 public String getBirthdayAsString() { 14 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 15 return this.birthday.format(dateTimeFormatter); 16 } 17}

Beansは、値を保持する為に存在すると言えば、ダメな気がするのですが、
重複を防ぐ観点で言えば、Beansに集約したほうが良いと思うのです。

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

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

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

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

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

y_waiwai

2021/04/04 04:41

Bean?Beans?とはなんでしょうか
guest

回答2

0

Javaというよりオブジェクト指向の原則を考えるべきですが、
値の保持と値の変換は全く別の役割なので、ダメです。

値を変換するときの多くは「出力のため」です。
DBに保存するときに型をあわせることもありますが、
あくまでDBへの受け渡しのためであって
Beanに保管するためではありません。

でもこれはあくまで一般論であって、
コンパイルエラーが出るとかコードが全く動かないとかそういうことになはならないので、**「プロジェクトやチームで決め事を作って守ればいいんじゃないか」**というのが直接の回答です。

既にそれなりに保守されてきたチーム内の仕組みなのであれば
尚更今から大きく方向転換するのは逆に色んなものを損ねますしね。
「新しく作る」時に検討することかと思います。

開発メンバーの入れ替わりが激しく重複した処理が度々作成されます。

というところから、既にグチャグチャなのがなんとなく伝わってくるので
おそらく1回捨てて作り直した方が早く確実でしょうし。
決めたうえで徹底できるようにメンバー教育とレビューしっかりしないといけませんしね。

投稿2021/04/04 05:12

m.ts10806

総合スコア80875

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

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

0

ベストアンサー

プロジェクトで決めればよいと思いますが、この対応で問題が解決されるかは疑問です。

getBirthdayAsStringを呼ばずに、ずっとgetBirthdayを使い、それを変換するコードが
残っていたら結局意味がないです。
メソッドを用意することと使用を強制させることが直接結びつかないです。

また日付フォーマットの異なるものが、無秩序に作成されそうな懸念もあります。

まずは、日付の型を統一するかどうかの判断をして、それらをリファクタリングで統一するのが
良いとは思うのですが、事情もあると思います・・・

統一するなら、特定のクラスに統一するのが良いと思いますがプロジェクト用に日付クラスを
作るのも手かと思います。
そうるれば件の型変換は、このクラスに集約できます。

統一せずに型変換を許容する方針として、
※たぶん、この質問の前提かとは想像しています
変換コードが散乱するのを防止したいというのであれば、変換用のユーティリティを作って
getBirthdayを使ってる部分を、一律その変換ユーティリティを使ってるかチェックするように
した方がよいかと思います。
※getBirthdayや、getXXXDateをgrepして、「Util.」があるかをチェックします。

もとの質問にあるメソッドを複数用意した場合は、grepで、その1行だけ見ても変換コードなのか
判断ができず、結局そのソースの該当箇所をわざわざ確認する作業が必要になります。

Utilクラスもそれぞれの型用に作られています

私の認識が間違っているかもしれませんが、
型用のUitlクラスでなく、役割用のUtilクラスを作り
オーバーロードで、異なる型を同じように処理する方が良いです。

たとえば、最初のgetBirthdayならUtil.getBirthday(ABean)、Util.getBirthday(CBean)のような
感じすると思います。

使用するBeanが多くメソッドを大量に作る可能性はありますが、使用するメソッドの集約は
のちのちクラスの統一をはかるうえでもメリットはありますし、
型変換のコードを独自に書かせないということを目的としているので多少コストかけてでもやる価値は
あると思います。

ちょっと長くなったのでポイントだけ整理すると

  • 型変換のメソッドを用意し、個人が変換コードをかかないようにする。
  • 型変換のメソッドを使用しているか、簡単にチェックできる仕組みにしておく

質問では最初の個人が変換コードを書かないは達成できるかもしれませんが、
それを確認する手段が少し面倒なので、別途クラス・メソッドを用意した方が良いと思いました。

投稿2021/04/05 01:06

momon-ga

総合スコア4826

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問