今回は、私たちはあなたと部分的に、一部では実用的な経験の数の中でLZ保守プロジェクトからの本から来ていくつかのヒントのリファクタリングを探索するLZ、脇これらの比較的低レベルのもののJAVA仮想マシンのソースを入れました。メッセージの猿の友人がこの技術を使用していた場合、また、あなたの小さな経験の中で記事に参加したい、他の人と共有することはほとんど経験、またLZの独自の定義の影響をグラフ化するために使用することができ、LZは非常に歓迎していません。
道の再建は、天然物の量をカバーするために、比較的に言えば、多くのすべてで言及されていないがされ、LZは、ここでの唯一のいくつかは、かなり多くの場合、よりハイエンドな方法のいくつかのように、戦術の一部を使用することができ、彼らが興味を持ってですあなたはカバーされ、いくつかの特殊な本を見つけることができます。
そこLZは、JAVAの開発を行っているので、ということもあるので、いくつかの改造のヒントが、それはプロセス指向言語、またはオブジェクト指向言語であるかどうかをJAVA言語、または密接にオブジェクト指向言語とリンクが、ほとんどのスキル月、それはすべてお互いに共通することができます。
ADOは、リーダーボード実践的なスキルで見てみましょう、それを再構築しました。
1号:精錬コードの重複
理由コードの重複は、この再構成を行うために、最大の再構築はほとんどの道の一つであり、それ以上言う必要はありません。それは、このような大幅に減少し、総コード、維持しやすいなど、多くの明白な利点があり、より読みやすいコードが構成されています。
その焦点は、特定のサブ機能の中でコードを完了するために重複したコードを見つけることです、後で見つけるそれらの間の適切なメソッドに移動し、適切なクラスに格納することを躊躇しないでください。
小さな例
class BadExample {
public void someMethod1(){
//code
System.out.println("重复代码");/* 重复代码块 */
//code
}
public void someMethod2(){
//code
System.out.println("重复代码");/* 重复代码块 */
//code
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod1(){
//code
someMethod3();
//code
}
public void someMethod2(){
//code
someMethod3();
//code
}
public void someMethod3(){
System.out.println("重复代码");/* 重复代码块 */
}
}
2号:セグメンテーション長いプロセス
長いプロセスについての分割、実際には、時には抽象とコードの重複が密接に接続され、しばしば私たちの精錬コードの過程で繰り返し、無意識のうちに長いプロセスの分割を完了しました。あなたが重複したコードのほとんどを抽出した後、まだ長い方法のいくつかを保持している場合、我々はこれらの長い特殊な方法が対処するために停止する必要があります。
この一つのことは、私たちはそれぞれの子にメソッド名の右から機能を付与する必要があるので、それは非常に重要であり、我々はほとんど彼らのはどの部門の機能の一部に反対する大規模な方法を分割するとき以来、注目したいのです。私たちは、この方法は時々プログラム猿のおおよそのレベルを反映することができ、良い名前を与えることができると言うことができます。
小さな例
class BadExample {
public void someMethod(){
//function[1]
//function[2]
//function[3]
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod(){
function1();
function2();
function3();
}
private void function1(){
//function[1]
}
private void function2(){
//function[2]
}
private void function3(){
//function[3]
}
}
3番:ネストされた条件分岐の最適化(1)
ネストされた条件分岐の多くは非常に簡単に法外なコードは、我々はこのコードを避けるべきです。構造的な原則はなく、ネストされた条件分岐のような大規模な数で、機能は一つだけの出口を持つことができることを言ってきたが、私たちはそれのこのいわゆるルールを忘れてみましょう。
医療専門家の文と呼ばれる用語があり、あなたはこの恐ろしいネストされた条件文を扱うことができます。その核となるアイデアは、裁判官の背面に影響を与えないように、状況は法の前に一定の条件を満たし、かつ速やか方法をジャンプしないということです。手術後、コードは非常に明確になります、次LZはあなたに古典的な例を与える与え、あなたは少し明確に見えるように二つの方法、この時、自分の見て判断することができます。
小さな例
class BadExample {
public void someMethod(Object A,Object B){
if (A != null) {
if (B != null) {
//code[1]
}else {
//code[3]
}
}else {
//code[2]
}
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod(Object A,Object B){
if (A == null) {
//code[2]
return;
}
if (B == null) {
//code[3]
return;
}
//code[1]
}
}
4番:最適化された入れ子の条件分岐(2)
ここでは、ネストされた条件分岐と上記とは若干異なるが、健康文を最適化するために使用することはできませんが、明確なコードの目的を達成するために、条件分岐とマージ、あるべきと述べました。またコーディングでは避けるべきである2、ネストされた条件分岐から見ることができ、それが大幅にコードの可読性を低下させるであろう。
小さな例の典型的なものであるしてください感じ未知の猿の友達リーの外観の下に。
小さな例
class BadExample {
public void someMethod(Object A,Object B){
if (A != null) {
if (B != null) {
//code
}
}
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod(Object A,Object B){
if (A != null && B != null) {
//code
}
}
}
第5号:削除1回の一時変数
私たちは、多くの場合、割り箸を使っ住んでいる、これは樹木の破壊です。しかし、小さな暴力のパフォーマンスのためだけではなく、1回の一時的な変数間のプログラムでは、コードの可読性の冒涜です。したがって、我々はいくつかの一回限りの一時変数の手術を必要としています。
小さな例
class BadExample {
private int i;
public int someMethod(){
int temp = getVariable();
return temp * 100;
}
public int getVariable(){
return i;
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
private int i;
public int someMethod(){
return getVariable() * 100;
}
public int getVariable(){
return i;
}
}
第6号:パラメータリストの排除が長すぎます
いくつかの方法は、多数のパラメータを渡すために、コードニートプログラム猿の検索は、許容されません。私たちは、パラメータの長いリストを削除するように、オブジェクトとしてメソッドに渡されたパラメータをカプセル化しようとすることができます。あなたは、このようなオブジェクトを検索しようとすると、ほとんどの場合、それはまだほとんどの場合、存在することが多いです、私たちは余分な作業を行う必要はありません。
小さな例
class BadExample {
public void someMethod(int i,int j,int k,int l,int m,int n){
//code
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public void someMethod(Data data){
//code
}
}
class Data{
private int i;
private int j;
private int k;
private int l;
private int m;
private int n;
//getter&&setter
}
7番:抽出物またはクラス継承階層定数
復興の目的は、マジック番号または文字列定数など、言うまでもなくから生じる欠点のマジックナンバーの一部を除去することで、それはプログラムの意図に混乱を作成します。などの文字列定数のタイプの排除、便利なメンテナンスより多くの利益のためとして。我々は唯一の定数を変更する必要があるので、あなたはの定数を使用するプログラムコードにすべての修正を完了することができます。
なお、このような最も一般的に似たような状況とは、基本クラスアクション、抽出のようなこれらの定数のINPUT、LIST、SUCCESSです。
小さな例
class BadExample {
public void someMethod1(){
send("您的操作已成功!");
}
public void someMethod2(){
send("您的操作已成功!");
}
public void someMethod3(){
send("您的操作已成功!");
}
private void send(String message){
//code
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
protected static final String SUCCESS_MESSAGE = "您的操作已成功!";
public void someMethod1(){
send(SUCCESS_MESSAGE);
}
public void someMethod2(){
send(SUCCESS_MESSAGE);
}
public void someMethod3(){
send(SUCCESS_MESSAGE);
}
private void send(String message){
//code
}
}
8号:レッツクラスはメソッドを提供する必要があります提供します
多くの場合、私たちはしばしば私たちが望む最終的な結果を得るために、クラスのプロパティのほとんどを運営しています。今回は、私たちがその代表して行うことができないはず、このクラスは、それが何をすべきかを間に合わせる必要があります。そして、時間のほとんどは、このプロセスは最終的に重複したコードのソースになります。
小さな例
class BadExample {
public int someMethod(Data data){
int i = data.getI();
int j = data.getJ();
int k = data.getK();
return i * j * k;
}
public static class Data{
private int i;
private int j;
private int k;
public Data(int i, int j, int k) {
super();
this.i = i;
this.j = j;
this.k = k;
}
public int getI() {
return i;
}
public int getJ() {
return j;
}
public int getK() {
return k;
}
}
}
/* ---------------------分割线---------------------- */
class GoodExample {
public int someMethod(Data data){
return data.getResult();
}
public static class Data{
private int i;
private int j;
private int k;
public Data(int i, int j, int k) {
super();
this.i = i;
this.j = j;
this.k = k;
}
public int getI() {
return i;
}
public int getJ() {
return j;
}
public int getK() {
return k;
}
public int getResult(){
return i * j * k;
}
}
}
第9号:スプリット長いクラス
それはLZ行の背後にあるように、この技術は、実際には非常に便利なスキルの一部ですが、理由は難易度の比較的高い程度の。それだけで小さな手段ではないので、この手法では、LZ技法は困難として、上記のように、シンプルで非常に簡単な例である問題の記述を与えます。
ほとんどの時間、焦点は、我々は、上記のクラスの性質に焦点を当てたクラスを分割する必要があります。2つのバッチをプロパティは、2つのバッチを使用して、論理的に別個の、及びでコードすることができるアウト分割濃縮属性は、特定の方法の中でもあるしました。実際にいくつかの属性はsplitメソッド内の二つのバッチに存在しているがある場合、それはこのように依存するパラメータ転送によって解決することができます。
、クラスは比較的大規模なプロジェクトであるスプリット復興の難しさがかなり大きいので、すべての後、多くの場合、クラスの多くのプログラムで使用されているカテゴリは、我々は慎重でなければならず、十分なテストを行います
第10号:親クラスの属性およびメソッドへの重複抽出継承階層
この技術は、十分な判断力、多くの時間を必要とする時間のほとんどは、これは実際にはテンプレートメソッドパターンのプロセスに移動しています。LZはここに、インスタンスを与えることはできませんが、理由はそれは小さな一例だからであることは意味がない、サブクラス以上のものは、それらのサブクラスに親クラスを削除するには、同じプロパティやメソッドを持っていないし、次に繰り返しプロパティまたはメソッド。
この1つは第九の復興に似ているので、多くの場合、再建のこのタイプは、小規模なプロジェクトではありません、我々は十分なケアとテストが必要です。あなたがこのテクニックを使用することができます前に、あなたは親クラスのプロパティやメソッドにこれらの抽出物を確認するのに十分な必要がある、時間の共通のサブクラスでなければなりません。
結論
LZ本研究は、これらの10の慣行上、LZは、ほぼすべての良いニュースを試すことができたので、比較的古いプロジェクトを維持することであるため、その結果はかなり良いですです。
近すぎるの実際の状況との最後の二つの限定されたコンタクト、LZは、単純な例を与えることができないように、しかし、すべての後の後者の二つは、一般に再構成技術を用いていないので、受け入れることができます。猿の友人が、このことを知っている。しかし、一般的には重要ではないという意味ではありませんではない、あなたはまだ持っています。上記の例は単純、実用的なアプリケーションを示すだけの方法であると言うことのような付加LZも、コードの構造が奇妙であってもよいが、それらは同じままです。だから、長いコアはそれぞれの道を捕まえて、それが混乱を作成して安全にこれらの葉から簡単です。
彼らはあなたが、より多くの人々がそれを見てみましょうの方法により、激励のLZをお勧めしていること、それに何かを感じた場合まあ、これはあなたが、小さなシェアは終わった猿の友人です。LZはそれから抜け出す道を擁護などその場合は、おそらく我々は各プロジェクトのコードを引き継いだ、彼らは非常に悪いではないでしょう、プロジェクトのために考慮することができます。