最近、結城さんの、『Java言語で学ぶリファクタリング入門』でリファクタリングを勉強していて、
著作権的に、リファクタリングについてそのまま解説することはしませんが、
ある、一部分の、これはメモしとかなきゃ忘れるなって部分を、
説明を一部変えるとか、より詳しくする感じで、メモを残していきます。
それでは、第1回目。(たぶんシリーズ化する・・・かも)
シンボリック定数っていう、設定なんかをfinalなフィールドとして、一箇所で宣言して
ソースコードではリテラルを使わず、その定数を使うっていうリファクタリングっていうか常識?があるんですけど(詳しい説明は本書で)
その、シンボリック定数っていうのは、あくまでリテラル(10とか20とか)に名前をつけてソースコードを見やすくするためのもの、修正しやすくするためのものであり、コンパイルすると、その定数がリテラルとして直接プログラムに埋め込まれちゃうんですね
で、何が問題かというと、シンボリック定数が複数のクラスにまたがって利用されている場合、
つまり、宣言するクラスと、利用するクラスが分かれている場合に、
先ほども書きましたが、コンパイルすると、参照ではなく、リテラルが埋め込まれるため
宣言するクラスを変更し、再コンパイルをしても、利用するクラスも再コンパイルしないと変更を反映しない
という点です。
具体的に言うと、
オセロのボードは8×8です(フツーは)。なので、ソースコードないでは、その8というリテラルをそのまま埋め込まずに、
public static final int BOARD_SIZE = 8;
みたいなことをします。そうすることで、10×10に変更したい時に、そこだけ変更すれば良いようにソースを書きます。
例えは、↓のように、Othelloというクラスに、オセロの処理を書いて、
その他諸々の設定をConfigクラスに書くといった風にしたとき
Othelloクラスをコンパイルすると、このクラスはConfigを利用しているので、Configも一緒にコンパイルされますが、
Configをコンパイルしても、Othelloはコンパイルされません(少なくとも↑のソースでは)
つまり、Configの値を変更して、Configクラスを再コンパイルしても、Othelloの機械コードには、"ConfigのBOARD_SIZEを参照せよ"ではなく”8”が入っているので、変更が反映されないのです。
まぁ、これが原因で問題が・・・ということは滅多にないと思いますが、一応、そういう風になっているんで覚えておこうかな
著作権的に、リファクタリングについてそのまま解説することはしませんが、
ある、一部分の、これはメモしとかなきゃ忘れるなって部分を、
説明を一部変えるとか、より詳しくする感じで、メモを残していきます。
それでは、第1回目。(たぶんシリーズ化する・・・かも)
シンボリック定数っていう、設定なんかをfinalなフィールドとして、一箇所で宣言して
ソースコードではリテラルを使わず、その定数を使うっていうリファクタリングっていうか常識?があるんですけど(詳しい説明は本書で)
その、シンボリック定数っていうのは、あくまでリテラル(10とか20とか)に名前をつけてソースコードを見やすくするためのもの、修正しやすくするためのものであり、コンパイルすると、その定数がリテラルとして直接プログラムに埋め込まれちゃうんですね
で、何が問題かというと、シンボリック定数が複数のクラスにまたがって利用されている場合、
つまり、宣言するクラスと、利用するクラスが分かれている場合に、
先ほども書きましたが、コンパイルすると、参照ではなく、リテラルが埋め込まれるため
宣言するクラスを変更し、再コンパイルをしても、利用するクラスも再コンパイルしないと変更を反映しない
という点です。
具体的に言うと、
オセロのボードは8×8です(フツーは)。なので、ソースコードないでは、その8というリテラルをそのまま埋め込まずに、
public static final int BOARD_SIZE = 8;
みたいなことをします。そうすることで、10×10に変更したい時に、そこだけ変更すれば良いようにソースを書きます。
例えは、↓のように、Othelloというクラスに、オセロの処理を書いて、
その他諸々の設定をConfigクラスに書くといった風にしたとき
Othelloクラスをコンパイルすると、このクラスはConfigを利用しているので、Configも一緒にコンパイルされますが、
Configをコンパイルしても、Othelloはコンパイルされません(少なくとも↑のソースでは)
つまり、Configの値を変更して、Configクラスを再コンパイルしても、Othelloの機械コードには、"ConfigのBOARD_SIZEを参照せよ"ではなく”8”が入っているので、変更が反映されないのです。
まぁ、これが原因で問題が・・・ということは滅多にないと思いますが、一応、そういう風になっているんで覚えておこうかな