Thứ Tư, 8 tháng 3, 2006

Test, test, test

bị ăn chửi, không hề oan chút nào bởi tính ẩu và khả năng tiếp nhận vấn đề không linh hoạt.

3 nhận xét:

  1. Ok, một kinh nghiệm xương máu nữa cho bản thân. Hơn nữa, try{} catch hay check trong service trở lên không cần thiết bởi throw Exception sẽ gửi nhiều thông điệp tới developer dùng service hơn.Mặt khác, nếu cứ ôm đồm quá nhiều việc trong service -> code sẽ chậm hơn.

    Một kinh nghiệm nữa là nên test kỹ, cái này đã tiếp thu và đang sửa đổi. Nhưng mình là vậy, khi tâm trạng đã bất ổn thì tay chân cũng luống cuống và mắt cũng mờ hơn. Đầu óc bây giờ cũng lạ, khả năng tiếp thu càng ngày càng chậm và khó hơn. Nhưng bù lại, hiệu quả tiếp thu nhanh hơn. Cũng cần phải cố mà hiểu thông điệp, ý tưởng người khác truyền đạt chứ không nên chạy theo ý thích của mình. Ôi trời biết đấy nhưng mà tại sao ,....

    Trả lờiXóa
  2. một kiểu viết code :

      
      public void styleCode1(){
        String[] array = {"aaa:aaa:aaa", "bbb:bbb:bbb"}; 
        for(String ele : array){
          if(ele != null && ele.length() > 1){
            System.out.println(ele);
            if(ele.indexOf(":") > -1){
              String[] split = ele.split(":");
              for(String s_ele : split)
                System.out.println(s_ele);
            }
          }
        }
      }
      

    và một kiểu khác:

      
      public void styleCode2(){
        String[] array = {"aaa:aaa:aaa", "bbb:bbb:bbb"}; 
        for(String ele : array)  sStyleCode2(ele);
      }
      
      private void sStyleCode2(String ele){
        if(ele == null || ele.length() < 1) return;
        System.out.println(ele);
        if(ele.indexOf(":") < 0) return;
        String[] split = ele.split(":");
        for(String s_ele : split)
          System.out.println(s_ele);
      }
      

    dĩ nhiên là thích kiểu viết thứ hai hơn rồi, trong code dễ nhìn hơn, sáng sủa hơn nhiều.

    Trả lờiXóa
  3. hôm nọ khi cài đặt một số module, gặp một lỗi rất cơ bản về vòng for, ẩu do nghĩ bừa, cũng không quá khó để tìm ra logic vấn đề.

    Có một List giả dụ như sau :

    String[] array = {"aaa", "bbb", "ccc", "ccc", "ddd", "eee", "ccc", "ccc"};
    List< String> list = new ArrayList< String>();
    for(String ele : array) list.add(ele);


    đoạn code sau lỗi concurrent ngay từ khi compile.

        for(String ele : list){
          if(ele.equals("ccc"))list.remove(ele);
        }

    còn với
        for(int i=0; i<list.size(); i++){
          if(list.get(i).equals("ccc")) list.remove(i);
        }

    thì compile ok, chạy ngon ơ nhưng logic chương trình đã sai (nguy hiểm thật), gặp hai phần tử là ccc nằm kế bên nhau thì list sẽ không được remove hết. Nếu thay list.remove(i); bằng list.remove(list.get(i)); thì kết quả sai sẽ khác nhau với trường hợp đề cập ở trên, do đó code không sài được, cũng không cần phải nghĩ nhiều để hiểu về logic runtime trong trường hợp trên. Một lỗi nguy hiểm và khó phát hiện. Trường hợp xảy ra tương tự với các loop có duyệt vị trí, còn với for each do duyệt queue nên dễ dàng throw ngay từ lúc compile.

    Cách sửa đổi hiệu quả nhất lùi vị trí con trỏ sau khi remove một phần tử, chẳng hạn :

        for(int i=0; i<list.size(); i++){
          if(list.get(i).equals("ccc")){
            list.remove(list.get(i));
            i--;
          }
        }

    Trả lờiXóa

nhudinhthuan@gmail.com