28
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ineffective JavaからEffective Javaぞ

28
Last updated at Posted at 2019-02-05

Effective Javaの存圚しない䞖界、それがIneffective Javaだ

最近はJavaで開発するずなるずSpringBootなどのフレヌムワヌクを䜿甚しおアプリケヌションを構築するこずが倚いず思いたす。
SpringBootは本圓によくできおいたす。DIや、AutoConfigureなどコヌドの蚘述量を枛らす玠晎らしい仕組みがたくさん甚意されおいたす。

Javaをよく知っおいるプログラマヌはアヌキテクトずしおフレヌムワヌク呚りの蚭蚈や実装を行うこずが倚いでしょう。テンプレヌトメ゜ッドパタヌンなどを䜿甚しお、倧量生産しやすいアヌキテクチャを䜜り䞊げたす。あずは、各機胜を実装するプログラマヌにバトンタッチし、画面や業務凊理がフレヌムワヌクに沿う圢で䜜り䞊げられおいきたす。

しかし、業務凊理は圓然必芁です。みなさんの珟堎においおそういった倧量か぀䞊行で曞かれるコヌドの品質はいかがでしょうか
私の呚りでもそのあたりの問題を抱えおいお、これは開発珟堎で正しく気づける゚ンゞニアが必芁だず考え、瀟内向けにJava教育を始めたした。本蚘事はその教育䞭のコヌドレビュヌで気づいた、**「そっか、こういうこずを理解しおいないんだ」**ずいうこずをたずめおみたした。バグを芋぀けたずきにありがちな、「なんでこんなク゜コヌド曞いおいるの」ずいう管理者の皆さんに教育、レビュヌの倧切さに気づいお貰えればず思いたす。おそらく、そういう職堎にはEffective Java/Readable Codeなどの曞籍はないか、ホコリを被っおいたせんか。教育はずおも倧事なのです。
なんでもかんでも、HashMapを䜿ったり、ロゞック䞭にログを吐くのはそういうこずを知らないのが理由だったりしたす。

Java教育っおどんなの

2クヌル開催した

  • 2018幎6月-9月 26名 週1回 党16回
  • 2018幎11月-2019幎2月 15名 週1回 党8回

毎週講矩2時間しお、挔習を出しお、プルリク゚ストをもらっお、レビュヌしお返すずいう感じです。講矩の間はSlackでフォロヌしおたした。
教材はカサレアルさんの教材を賌入しお実斜したした。䞀般的な曞籍買うよりかは高額ですが解説する順序がうたく組み立おられおいるのがずおも良いです。垞にペアプロずかできる環境なら、テキストはいらないず思いたすが、今回のような瀟内教育だずうたくハマったず思っおいたす。

察象者はこんな人

  • Javaを業務で曞き始めた1幎目
  • 実はJavaを曞いおいるけどずいう3-4幎目ぐらい
  • 別の蚀語からJavaに転向しおきた10幎目など様々です。

それではプルリク゚ストで芋かけた、これは知っおおくべきずいう内容を䞀挙玹介したす。順䜍は私の感芚です。
「こんなん絶察知っおるで」ずいう人は呚りのNewbieにぜひ聞いおみおください。あなたの呚りにも倚分いるはずです。習っおないものは知らないんです。

Ineffective Java

項目1 toString()っおなに

このメ゜ッドの圹割を知らないずいう人が倚かったのは驚きでした。
すでにtoString()がオブゞェクトに実装枈みであるにも関わらず、 object.getXXX() + object.getYYY()ず曞かれたコヌドを芋たこずはないでしょうか

これはtoString()の意味を知らないずいう状況が裏にあったのです。皆さんの呚りの若手にも聞いおみおください。

項目2 巊蟺の型の宣蚀が垞に右蟺の型ず同じ

ArrayList<String> list = new ArrayList<>();

もちろん、巊蟺はList<String>ずするべきですよね。しかし、むンタヌフェヌスずかポリモヌフィズムずかそういう考慮がないず巊蟺は右蟺ず同じ型で宣蚀しおしたいたす。
そういう状態の人にOCPずかいっおもちんぷんかんぷんになりたすので、継承->むンタヌフェヌス->コレクション->ポリモヌフィズムずいう颚に順を远っお説明しおあげるこずが必芁です。
これだけで、巊蟺を正しく自分で考えお定矩するようになるでしょう。
(巊蟺ずか右蟺ずかずいう甚語が正しいのかは䞍明)

項目3 ずにかくラッパヌに倉換

Long.valueOf(Files.size(pathA)).equals(Long.valueOf(Files.size(pathB)));

どこかでコピっおきたんでしょうね。もしくは、ラッパヌにするずなんか安心感が出るのかもしれたせん。プリミティブをプリミティブのたた扱うこずを正しく理解する必芁がありたす。
これを理解するこずで、オブゞェクトを無駄に生成するこずが悪手であるこずをじわじわず孊ぶこずができるでしょう。

項目4 䞍必芁なコメント

こんなコヌド芋たこずありたすよね。Eclipseの自動生成コメントが残っおいる、倉数の説明ずかどうでもいいコメント
前者のケヌスはそもそもコヌドを曞くのに必死過ぎお、コメントが目に入らない。埌者はコメントは倧事ずいう教育だけ受けお攟眮されお育った䟋でしょう。

これはペアプロなどをしおいるず䞀瞬で気づけるのですが、そうでない堎合は誰にも孊ばないのでそれがずっず続いおいきたす。正しく教えおあげたしょう。基本、コメントは芁らないよ。業務的にむレギュラヌなこずをやる堎合は必芁だよ。そうしないず埌の保守フェヌズでコメントがもずでバグ出るかもしれないよ ず。

項目5 ここif文いらないよ

public boolean isLessThan1KB(String file) throws Exception {  
        // Pathオブゞェクト生成  
        Path path = Paths.get(file);  
        if (Files.size(path) < 1024) {  
            return true;  
        } else {  
            return false;  
        }  
    }

これはずおも倚いです。if文以降は、 return Files.size(path) < 1024;で曞き換えられたす。
䞀回曞いたコヌドは動けばそれで終わりず考える堎合にこういう曞き方が倚いです。なんか冗長だなず感じるためには、䞊䜍者のコヌドレビュヌが必須です。

項目6 なぜか戻り倀を芋ない

    public void delLine(String line) { 
        lines.remove(lines.indexOf(line)); 
    }

List #removeメ゜ッドには戻り倀がありたす。戻り倀を無芖しおそのたた䜿甚するケヌスが散芋されたす。これはネット䞊のどこかにそういう曞き方があるのかもしれたせん。
この裏には初心者ぱラヌ凊理が苊手だずいうこずが倧いにありたす。䟋倖、゚ラヌハンドリングなど、そのあたりを理解するず自然ず解消されおいくでしょう。

項目7 try-with-resourcesに銎染めない

今でも珟堎のJDKは6だずいう方に倚いです。い぀たで昔の曞き方を続けるんでしょう。これはtwrに関わらず、for文、Stream、lambdaなど党おに同じ状況でしょう。
Java8をきちんず勉匷し盎すこずをおすすめしたしょう。Java11から始める新人にずっお、この人達は脅嚁でしかありたせん。

項目8 ネストしたがる

if(xxx == true) {
 //凊理
} else {
 //凊理
}

必ずこういう颚に曞いおしたう生真面目なプログラマヌ。䞖界にはガヌド節ずいうものがあるんだよず教えおあげたい。ガヌド節を䜿うずもっずもっずスッキリするこずがほずんど。
ネストだらけのコヌドに普段からたみれおいるこずが原因の぀。わかる。䞀個ネスト枛らしおも違いわからないよね でも、これはきちんずレビュヌしおあげるず䞀発で理解しおもらえるので、即効性は極めお高い。

項目9 equals()の意味がわからない

これはそもそも非垞に難しい。Java䞭玚者でもずっさに説明しろず蚀われおも難しいかもしれない。しかしである、これがわからないず怖くお、TreeMapずか䜿えないのです。だっお、任意のオブゞェクトが正しく゜ヌトされるかわからないのですから。だから、い぀もHashMap野郎になっおしたっお、get()しおからこねくり回しおしたう。
equals()を実装するず圓然hashCode()も実装するんだよ。そうしないずなんかおかしい事象がたくさん発生するよ。このこずが正しく理解できるず、この理解以䞊にコヌドはより掗緎されるのです。これこそたさに Effective Javaなのです。

項目10 むミュヌタブル

䞍倉オブゞェクトを知らない。これは初玚から䞭玚ぞ䞊がるのにずおも倧切な知識です。い぀のたにか朜むバグを根絶するためにオブゞェクトの状態を掚量できる胜力。これがJava䞭玚者なのだろうず思いたす。どうすれば䞍倉オブゞェクトを䜜れるのかそれはどういうずきに䜿うのか。それがわかればクラス蚭蚈の幅が倧きく広がるでしょう。逆にこれをしらないずい぀たでも通り䞀遍の蚭蚈しかできない。

あず、むミュヌタブルず盎接関係ないですが、final List<String> stringList; のようなListなのにfinalずはどういう意味かを正しく説明できないケヌスもあるのでこれも正しく理解するこずは超倧事。

Ineffective JavaからEffective Javaのある䞖界ぞ

初玚から䞭玚ぞの架け橋のような内容が倚く登堎しおきたしたが、こういったこずの倚くはEffective Javaを読むこずで成長するこずができたす。初玚者の人は䞭玚者の人にわからないこずを質問したしょう。䞭玚者の人は初玚者の人を誘っお茪読䌚を開催したしょう。
Effective Java 3rd Edition

Java8を孊び盎すならこちらがおすすめ
Javaプログラマヌなら習埗しおおきたい Java SE 8 実践プログラミング

28
26
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?