Javaプログラマーの日常——一日の仕事の収穫

5134 ワード

テーマを見るといたずらかもしれないが、実は専門知識がたくさんある.最初からデザインの原則に気づかず、後のjquery実戦テクニックまで、今日一日で出会った問題です.毎日少しずつ整理して、毎日少しずつ収穫します.
ソフトウェア設計について
システム構造を設計する際には、いくつかのソフトウェア設計方法が重要です.
例えば、開閉の原則は、
  • 対の拡張はオープン
  • です
  • 対の修正は閉じた
  • である.
    上記の2つの点を達成するには、アプリケーションアーキテクチャを設計する際に、コアのニーズポイントを整理する必要があります.問題を解決するための最小限の、最も核心的な設計構造を完成します.他のビジネスロジックやアプリケーションのニーズは、このコア構造に基づいて拡張されるべきです.
    ソフトウェア設計の6つの原則についてお話しします.
  • 開閉原則:すなわち拡張式開放;修正はオフです.
  • 単一職責原則:職責の拡散を回避し、各クラスは1つの機能
  • のみを完了しなければならない.
  • 里氏置換の原則:子クラスは親の機能を拡張することができるが、親の元の機能
  • を変えることはできない.
  • 依存逆置き原則:高レベルと低レベルの実現の関係をデカップリングし、インタフェースのような方法でデカップリング
  • を行う.
  • インタフェース分離の原則:クライアントは不要なインタフェース方法
  • を実現すべきではない.
  • ディミット法則:オブジェクト間の依存関係を最小限に抑える
  • このいくつかの法則は,まだゆっくり悟らなければならないだろう.
    Javaについて
    Javaクラスでの現在のCLASSのパスの取得
    背景
    コアパッケージはサービスに依存し、Springの方法でSpring mvcのコンテキストを取得し、beanを取得します.
    public class BeanUtil {
    
        /**
         *     web   spring     
         * @return
         */
        public static ApplicationContext getWebApplicationContext(){
            return ContextLoader.getCurrentWebApplicationContext();
        }
        
        /**
         *   bean id  bean  。
         * @param beanId bean id
         * @return Object
         */
        public static Object getBean(String beanId){
            if (isEmpty(beanId)){
                return null;
            }
            WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();  
            return wac.getBean(beanId);
        }
    
        private static boolean isEmpty(String beanId) {
            return beanId == null || beanId.trim().equals("");
        }   
    }

    コアパケットと実行時の依存関係をデカップリングすることが設計上要求されるため,この方式は使用できない.
    そこでサービスを単例工場に改造し、問題が発生しました...単一のファクトリは、実行時のディレクトリに依存します.このディレクトリはspring mvcで取得しました!これで困った...
    いくつかの方法を試しました.
    System.getProperty("user.dir")
    上で取得したのはJREのディレクトリで、需要を満たすことができません.
    XXX.class.getClassLoader().getResource(File.separator.toString())
    上記の方法では,現在のクラスでコンパイルされたclassのパスに戻ることができ,この方法でwebコンテナのパブリッシュ後のアドレスも得ることができる.
    String path = this.getClass().getClassLoader().getResource(File.separator.toString()).getPath();

    Javaでのコールバック
    Javaでは、コールバックも実現できますが、インタフェースが入ってきただけです.
    interface ICallBack{
        void run();
    }
    class CallBackClass implements ICallBack{
        public void run(){
            System.out.println(System.currentTimeMillis() );
        }
    }
    class Controller{
        public ICallBack CallBackObject = null;//       
        Scanner input = new Scanner(System.in); //       
        public Controller(ICallBack obj){
            this.CallBackObject = obj;
        }
        public void Begin(){
            while(input.next() != null){
                CallBackObject.run();
            }
        }
    }
    public class Callback{
        public static void main(String[] args) {
            Controller obj = new Controller(new CallBackClass());
            obj.Begin();
        }
    }

    スタティックブロックによるBUGについて
    偶然にも、昨日『プログラミング思想』を見たばかりで、静的ブロックを含むクラスロードの手順が、今日ちょうどこの問題に遭遇しました.
    問題の背景を簡単に説明する
    Javaアプリケーションでは埋め込みJrubyを使用する必要があります.これにより、ScriptContainerを起動してrubyをコンパイルする必要があります.一方、ScriptContainerはJVMで1部しかメンテナンスされません.私たちのコードでは次のようになっています.
    static{
        scriptContainer = new ScriptContainer();
    }

    Springのコンテキストを使用して初期化されているため、Webコンテナの起動時に実行されます.その後、単一の工場に変更され、scriptContainerの初期化はトリガーされなかった.
    静的ブロックは、クラスロードをトリガすることなく実行されません.クラスのオブジェクトを作成したり、クラスの静的コンテンツにアクセスしたりした場合にのみトリガーされます.
    そのため、投機は巧みに次のような方法で問題を解決しました.
    //         
    class XXX{
        public static String a = "";
        static{
            //todo
        }
    }
    //           :
    XXX.a = "a";

    Jqueryについて
    一般的にJQueryを使用する場合には大量のDOM操作が使用されますが、この場合は様々な性能の問題が発生しやすくなります.
    DOM再描画の削減
    大量の作成オブジェクトに遭遇した場合は、DOMの再描画を減らす必要があります.
    a.append(xxx);
    a.append(xxx);
    a.append(xxx);
    a.append(xxx);
    a.append(xxx);
    a.append(xxx);

    次のように変更する必要があります.
    var html = xxx+xxx+xxx+xxx+xxx;
    a.append(xxx);

    イベントキャプチャを使用して、大量のイベントバインドを回避
    テーブルがある場合、テーブルは動的にいくつかのコンテンツを作成しますが、これらのコンテンツにイベントを追加するにはどうすればいいですか?イベントのメカニズムを使用できます.
    $("#tableId").click(function(event){
        var target = $(event.target);//   Jquery  
            
        if(event.target.nodeName === "TR"){//            
                //           ,           ,     !
        }
    });

    jquery検証、削除、class追加
    $xxx.hasClass("classname");
    $xxx.removeClass("classname");
    $xxx.addClass("classname");

    jquery CSSスタイルの追加
    $xxx.css("width","250px");

    アダプティブ高さの入力ボックス
    内容を入力すると、自動的に高さが計算されます.
    //   html