대상을 향한 6대 원칙 중 하나

3198 단어

단일 직책 원칙(코드 최적화의 첫걸음)

  • 설명: 대체적으로 코드의 각 클래스 간의 직책이 명확하고 자신이 해야 할 일만 하며 자신이 변할 때 다른 클래스에 영향을 주지 않는다.모든 끄고 싶지 않은 기능이 같은 클래스에서 완성되어서는 안 된다. 그렇지 않으면 마지막에 한 클래스에 많은 코드가 생겨서 읽기에도 불리하다.우수한 프로그래머는 자신의 코드를 끊임없이 최적화하여 그것을 더욱 디자인적인 감각을 가지게 할 수 있다.
  • 예: 다운로드 이미지와 캐시를 쓰는 기능
  • public class ImageLoader {
    
    //    
    public LruCache bitmapLruCache;
    
    //         cup  
    ExecutorService executorService =       
    Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    public ImageLoader() {
        initCache();
    }
    
    /***
     *     
     */
    public void initCache() {
        int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        int cacheSize = maxMemory / 4; //      
        bitmapLruCache = new LruCache(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getRowBytes() * value.getHeight() / 1024;    
                //         
            }
        };
    }
    
    /**
     *     
     *
     * @param url
     * @param imageView
     */
    public void displayImage(final String url, final ImageView imageView) {
        imageView.setTag(url);
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = downloadImage(url);
                imageView.setImageBitmap(bitmap);
                //  
                bitmapLruCache.put(url, bitmap);
            }
        });
    }
    
    /**
     *       
     *
     * @param url
     */
    private Bitmap downloadImage(String url) {
        Bitmap bitmap = null;
    
        try {
            URL url1 = new URL(url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)   
            url1.openConnection();
            bitmap = BitmapFactory.decodeStream(httpURLConnection.getInputStream());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
      }
    }
    

    이러한 기능은 하나의 클래스에 쓰여져 있다. 그 중의 한 방법의 코드가 바뀔 때 다른 것도 따라서 바뀐다. 그래서 우리는 코드를 더욱 유연하고 확장시켜야 한다. 캐시 기능과 다운로드 디스플레이 기능을 분리해서 쓸 수 있다.
    ![    UML ](http://note.youdao.com/favicon.ico) 
    
    
    
     public class ImageCache {
        //    
        public LruCache bitmapLruCache;
        //         cup  
        ExecutorService executorService =     
        Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    
        public static ImageCache imageCache;
    
       public static ImageCache getInstache() {
             if (imageCache == null) {
             imageCache = new ImageCache();
             }
            return imageCache;
         }
    
        public ImageCache() {
           initCache();
        }
    
    
    /**    */ 
    
    public void initCache() {
    int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    int cacheSize = maxMemory / 4; //      
     bitmapLruCache = new LruCache(cacheSize) {
     @Override
     protected int sizeOf(String key, Bitmap value) {
     return value.getRowBytes() * value.getHeight() / 1024; //         
        }
      };
     }
     public void put(String url, Bitmap bitmap) {
       bitmapLruCache.put(url, bitmap);
     }
    
     public Bitmap getBitmap(String url) {
       if (bitmapLruCache != null) {
         return bitmapLruCache.get(url);
        }
      return null;
     }
    
    }

    좋은 웹페이지 즐겨찾기