きしだのはてな このページをアンテナに追加 RSSフィード

2017-03-31(金) Javaの難しいところ

[]Javaの難しいところ 23:50 Javaの難しいところを含むブックマーク

Javaをプログラム未経験者に教えるときの話。

細かいところまでちゃんと理解するための難しさではなくて、とりあえず頻出コードが読み書きできるまでの難しさの話です。細かいところまでの理解、どの言語も難しいので。

あと、ここではプログラム自体の難しさは別の話、ということで。

で、Javaには難しいところが結構あるんですけど、難しいのをひとことでいうと「昔の事情や歴史的経緯により、が多い」ところです。


プログラムを教えるときに何が難しいか

たとえばpublic static void mainを書くとか、おまじないが多いとか記述量が煩雑とかは、ツールで対処可能で、ツールで対処可能というのは機械的に慣れればいい部分なので、そこまで問題にならないと思います。

あと「おまじないを減らしたい」というのは教える側のこだわりであって、理解しやすさとは別で、そのおまじないがどういうときに必要かというところさえ理解できればいいと思います。ないほうが楽ではあると思いますけど。

ツールの導入もインストーラダウンロードして「次へ」を押しまくるのは、そう問題じゃないと思われ。


つまり「慣れ」ではなくて「理解」が必要なところに難しさがあると思います。

そういう、プログラムの学習が難しくなる要因として、プログラム自体の本質的は難しさとは別に、大きく2つ、次のようなものがあると思っています。

  • 同じことを実現するために、異なる2つの機能がある
  • 暗黙のルール

同じことを実現するために、異なる2つの機能がある

シンタックスシュガーは除き、同じことを書くときに2つの選択肢があるのは結構つらいです。

Javaが難しい部分の多くは、こちらになると思います。

  • classとinterface
  • intとInteger(基本型とラップクラス)
  • Listと配列
  • forとforEach
  • DateとLocalDateTime

まあ、最近はインタフェースをimplementsする機会は減っているし、自分で定義する機会もあまりないので、必要になったときには こう書け、って感じでいい気がします。型として使う分には、クラスと区別する必要はないし。

forとforEach、DateとLocalDateTimeも、好みやシチュエーションの問題ではある。


ただ、基本型とラップクラスや、Listと配列は、普通にコードを書くときについてまわるし、Streamを使うときには意識する必要があるので、ちょっと困る。

Streamがなければ、「配列は使わない」「ラップクラスはGenericsで指定するとき用」くらいの雑さで回避することができたのだけど。

Valhallaでどうにかなりそうなのが救い。

暗黙のルール

書いたコードの裏でいろいろ行われて、知らなければ書けないとかエラーが意味わからなくなるとか、そういうの。

Javaの場合はコンストラクタとラムダ。staticメンバとインスタンスメンバ。デフォルトスコープ。


コンストラクタの場合、暗黙でsuper()が呼び出されるやつと、引数ありのコンストラクタを定義するとデフォルトコンストラクタがなくなるののコンボで、意味不明なコンパイルエラーがでるのが罠でした。

class Foo{
  Foo(int a) {}
}
class Bar extends Foo{
}

で出るコンパイルエラー。

最近は継承使う機会も減っているので、逃げれる気はする。


staticメンバとインスタンスメンバもつらいな。まあ、入門時にはぜんぶ非staticで。

スコープ(可視性)も最初はあんまり意識しなくてもいいか。


しかし、ラムダ、おまえだけはだめだ。

未定義メソッドが1つのインタフェースに対してそのメソッドのシグネチャを使って、引数ひとつのときにはカッコや型が省略でき・・・、というの。

まあ、現実的に出てくるのはFunction、Runnable、Consumer、Supplierくらいなので、そこだけ押さえて、あとはMap.forEachみたいなのは「こう書けますよ」くらいでいいのかな。

いけるかな。

というか、そう逃げるしかない気がするな。

2017-03-20(月) Java9で小の月を列挙する

[][]Java9で小の月を列挙する 04:55 Java9で小の月を列挙するを含むブックマーク

jshell> LocalDate.of(2017,1,31).datesUntil(LocalDate.of(2018,1,1),Period.ofMonths(1)).
   ...> filter(d -> d.getDayOfMonth() != 31).
   ...> map(LocalDate::getMonth).
   ...> toArray()
$163 ==> Object[5] { FEBRUARY, APRIL, JUNE, SEPTEMBER, NOVEMBER }

あ、ふつうにこれでよかった

jshell> Arrays.stream(Month.values()).filter(m -> m.maxLength() != 31).toArray()
$165 ==> Object[5] { FEBRUARY, APRIL, JUNE, SEPTEMBER, NOVEMBER }
トラックバック - http://d.hatena.ne.jp/nowokay/20170320

2017-02-20(月) Learn about asynchronous processing with Dagger by PPAP

[]Learn about asynchronous processing with Dagger by PPAP 11:28 Learn about asynchronous processing with Dagger by PPAPを含むブックマーク

At the previous article, I introduce the DI function in the Dagger.

PPAPで学ぶDaggerによるDI - きしだのはてな(Japanese)

Dagger is known as a DI container, but it is not known that can be used as an asynchronous framework.

There had been the function, but there was not a document about it. nowadays there is a document but we can not notice it can be used for an asynchronous process.

https://google.github.io/dagger/producers.html


At a server side, already they may have used DI containers such as Springframework or CDI.

Moreover the DI on Dagger is not enough for a server side, it can not be a candidate often.

But in the case of using as asynchronous processing framework, it is useful even with SpringFramework or CDI.


続きを読む

2017-01-09(月) PPAPで学ぶDaggerによる非同期処理をZipkinで確認

[]PPAPで学ぶDaggerによる非同期処理をZipkinで確認 08:26 PPAPで学ぶDaggerによる非同期処理をZipkinで確認を含むブックマーク

前回、Daggerで非同期処理をやってみました。

PPAPで学ぶ、Daggerによる非同期処理 - きしだのはてな

ただ、こういうログでの実行結果を見せられて、ほら非同期になってるでしょって言われてもよくわからないと思うので、Zipkinで見てみます。

f:id:nowokay:20170108211421p:image


Zipkinは、GoogleDapper論文を参考にTwitterが開発してオープンソースにした分散トレースシステムです。

http://zipkin.io/


続きを読む

2017-01-08(日) PPAPで学ぶ、Daggerによる非同期処理

[]PPAPで学ぶ、Daggerによる非同期処理 21:19 PPAPで学ぶ、Daggerによる非同期処理を含むブックマーク

前回は、DaggerのDI機能を紹介しました。

PPAPで学ぶDaggerによるDI - きしだのはてな

DaggerはDIコンテナとしては知られていますが、非同期処理フレームワークとして使えることはあまり知られていないと思います。機能はあったのに、ドキュメントがなかったし、ドキュメントも非同期処理に使えることがわかりにくいし。

https://google.github.io/dagger/producers.html


サーバーサイドではSpringFrameworkやCDIなどのDIコンテナがすでに使われているのと、DaggerのDIでは機能不足であるため、Daggerが候補になることはあまりありません。

でも、非同期処理フレームワークとしてであれば、SpringFrameworkやCDIを使っている状況でも有用です。


続きを読む

トラックバック - http://d.hatena.ne.jp/nowokay/20170108