thắc mắc Các bác review code giúp em ạ

  • Người tạo chủ đề Người tạo chủ đề tranhungajc
  • Ngày bắt đầu Ngày bắt đầu

tranhungajc

Junior Member
package com.salesmanager.shop.filter;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.core.business.services.merchant.MerchantStoreService;
import com.salesmanager.core.business.services.user.UserService;
import com.salesmanager.core.business.utils.CacheUtils;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.user.User;
import com.salesmanager.shop.admin.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.utils.LanguageUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


public class AdminFilter extends HandlerInterceptorAdapter {


private static final Logger LOGGER = LoggerFactory.getLogger(AdminFilter.class);

@Inject
private MerchantStoreService merchantService;

@Inject
private UserService userService;

@Inject
private CacheUtils cache;

@Inject
private LanguageUtils languageUtils;

public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {

request.setCharacterEncoding("UTF-8");
@SuppressWarnings("unchecked")
Map<String, Menu> menus = (Map<String, Menu>) cache.getFromCache("MENUMAP");

User user = (User) request.getSession().getAttribute(Constants.ADMIN_USER);


String storeCode = MerchantStore.DEFAULT_STORE;
MerchantStore store = (MerchantStore) request.getSession().getAttribute(Constants.ADMIN_STORE);


String userName = request.getRemoteUser();

if (userName == null) {//** IMPORTANT FOR SPRING SECURITY **//
//response.sendRedirect(new StringBuilder().append(request.getContextPath()).append("/").append("/admin").toString());
} else {

if (user == null) {
user = userService.getByUserName(userName);
request.getSession().setAttribute(Constants.ADMIN_USER, user);
if (user != null) {
storeCode = user.getMerchantStore().getCode();
} else {
LOGGER.warn("User name not found " + userName);
}
store = null;
}

if (user == null) {
response.sendRedirect(request.getContextPath() + "/admin/unauthorized.html");
return true;
}

if (!user.getAdminName().equals(userName)) {
user = userService.getByUserName(userName);
if (user != null) {
storeCode = user.getMerchantStore().getCode();
} else {
LOGGER.warn("User name not found " + userName);
}
store = null;
}

}

if (store == null) {
store = merchantService.getByCode(storeCode);
request.getSession().setAttribute(Constants.ADMIN_STORE, store);
}
request.setAttribute(Constants.ADMIN_STORE, store);


Language language = languageUtils.getRequestLanguage(request, response);

if (language == null) {

//TODO get the Locale from Spring API, is it simply request.getLocale() ???
//if so then based on the Locale language locale.getLanguage() get the appropriate Language
//object as represented below
if (user != null) {
language = user.getDefaultLanguage();
if (language == null) {
language = store.getDefaultLanguage();
}
} else {
language = store.getDefaultLanguage();
}

request.getSession().setAttribute("LANGUAGE", language);

}


request.setAttribute(Constants.LANGUAGE, language);


if (menus == null) {
InputStream in = null;
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
try {
in =
this.getClass().getClassLoader().getResourceAsStream("admin/menu.json");

Map<String, Object> data = mapper.readValue(in, Map.class);

Menu currentMenu = null;

menus = new LinkedHashMap<String, Menu>();
List objects = (List) data.get("menus");
for (Object object : objects) {
Menu m = getMenu(object);
menus.put(m.getCode(), m);
}

cache.putInCache(menus, "MENUMAP");

} catch (JsonParseException e) {
LOGGER.error("Error while creating menu", e);
} catch (JsonMappingException e) {
LOGGER.error("Error while creating menu", e);
} catch (IOException e) {
LOGGER.error("Error while creating menu", e);
} finally {
if (in != null) {
try {
in.close();
} catch (Exception ignore) {
// TODO: handle exception
}
}
}

}


List<Menu> list = new ArrayList<Menu>(menus.values());

request.setAttribute("MENULIST", list);

request.setAttribute("MENUMAP", menus);
response.setCharacterEncoding("UTF-8");

return true;
}


private Menu getMenu(Object object) {

Map o = (Map) object;
Map menu = (Map) o.get("menu");

Menu m = new Menu();
m.setCode((String) menu.get("code"));


m.setUrl((String) menu.get("url"));
m.setIcon((String) menu.get("icon"));
m.setRole((String) menu.get("role"));

List menus = (List) menu.get("menus");
if (menus != null) {
for (Object oo : menus) {

Menu mm = getMenu(oo);
m.getMenus().add(mm);
}

}

return m;

}

}
 
Forum có chức năng embedd code nhé bạn

Java:
package com.salesmanager.shop.filter;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.core.business.services.merchant.MerchantStoreService;
import com.salesmanager.core.business.services.user.UserService;
import com.salesmanager.core.business.utils.CacheUtils;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.user.User;
import com.salesmanager.shop.admin.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.utils.LanguageUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class AdminFilter extends HandlerInterceptorAdapter {

  private static final Logger LOGGER = LoggerFactory.getLogger(AdminFilter.class);

  @Inject
  private MerchantStoreService merchantService;

  @Inject
  private UserService userService;

  @Inject
  private CacheUtils cache;

  @Inject
  private LanguageUtils languageUtils;

  public boolean preHandle(
    HttpServletRequest request,
    HttpServletResponse response,
    Object handler) throws Exception {

    request.setCharacterEncoding("UTF-8");
    @SuppressWarnings("unchecked")
    Map < String, Menu > menus = (Map < String, Menu > ) cache.getFromCache("MENUMAP");

    User user = (User) request.getSession().getAttribute(Constants.ADMIN_USER);

    String storeCode = MerchantStore.DEFAULT_STORE;
    MerchantStore store = (MerchantStore) request.getSession().getAttribute(Constants.ADMIN_STORE);

    String userName = request.getRemoteUser();

    if (userName == null) { //** IMPORTANT FOR SPRING SECURITY **//
      //response.sendRedirect(new StringBuilder().append(request.getContextPath()).append("/").append("/admin").toString());
    } else {

      if (user == null) {
        user = userService.getByUserName(userName);
        request.getSession().setAttribute(Constants.ADMIN_USER, user);
        if (user != null) {
          storeCode = user.getMerchantStore().getCode();
        } else {
          LOGGER.warn("User name not found " + userName);
        }
        store = null;
      }

      if (user == null) {
        response.sendRedirect(request.getContextPath() + "/admin/unauthorized.html");
        return true;
      }

      if (!user.getAdminName().equals(userName)) {
        user = userService.getByUserName(userName);
        if (user != null) {
          storeCode = user.getMerchantStore().getCode();
        } else {
          LOGGER.warn("User name not found " + userName);
        }
        store = null;
      }

    }

    if (store == null) {
      store = merchantService.getByCode(storeCode);
      request.getSession().setAttribute(Constants.ADMIN_STORE, store);
    }
    request.setAttribute(Constants.ADMIN_STORE, store);

    Language language = languageUtils.getRequestLanguage(request, response);

    if (language == null) {

      //TODO get the Locale from Spring API, is it simply request.getLocale() ???
      //if so then based on the Locale language locale.getLanguage() get the appropriate Language
      //object as represented below
      if (user != null) {
        language = user.getDefaultLanguage();
        if (language == null) {
          language = store.getDefaultLanguage();
        }
      } else {
        language = store.getDefaultLanguage();
      }

      request.getSession().setAttribute("LANGUAGE", language);

    }

    request.setAttribute(Constants.LANGUAGE, language);

    if (menus == null) {
      InputStream in = null;
      ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
      try {
        in =
        this.getClass().getClassLoader().getResourceAsStream("admin/menu.json");

        Map < String, Object > data = mapper.readValue( in , Map.class);

        Menu currentMenu = null;

        menus = new LinkedHashMap < String, Menu > ();
        List objects = (List) data.get("menus");
        for (Object object: objects) {
          Menu m = getMenu(object);
          menus.put(m.getCode(), m);
        }

        cache.putInCache(menus, "MENUMAP");

      } catch (JsonParseException e) {
        LOGGER.error("Error while creating menu", e);
      } catch (JsonMappingException e) {
        LOGGER.error("Error while creating menu", e);
      } catch (IOException e) {
        LOGGER.error("Error while creating menu", e);
      } finally {
        if ( in != null) {
          try {
            in .close();
          } catch (Exception ignore) {
            // TODO: handle exception
          }
        }
      }

    }

    List < Menu > list = new ArrayList < Menu > (menus.values());

    request.setAttribute("MENULIST", list);

    request.setAttribute("MENUMAP", menus);
    response.setCharacterEncoding("UTF-8");

    return true;
  }

  private Menu getMenu(Object object) {

    Map o = (Map) object;
    Map menu = (Map) o.get("menu");

    Menu m = new Menu();
    m.setCode((String) menu.get("code"));

    m.setUrl((String) menu.get("url"));
    m.setIcon((String) menu.get("icon"));
    m.setRole((String) menu.get("role"));

    List menus = (List) menu.get("menus");
    if (menus != null) {
      for (Object oo: menus) {

        Menu mm = getMenu(oo);
        m.getMenus().add(mm);
      }

    }

    return m;

  }

}
 
Forum có chức năng embedd code nhé bạn

Java:
package com.salesmanager.shop.filter;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.salesmanager.core.business.services.merchant.MerchantStoreService;
import com.salesmanager.core.business.services.user.UserService;
import com.salesmanager.core.business.utils.CacheUtils;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.user.User;
import com.salesmanager.shop.admin.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.utils.LanguageUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class AdminFilter extends HandlerInterceptorAdapter {

  private static final Logger LOGGER = LoggerFactory.getLogger(AdminFilter.class);

  @Inject
  private MerchantStoreService merchantService;

  @Inject
  private UserService userService;

  @Inject
  private CacheUtils cache;

  @Inject
  private LanguageUtils languageUtils;

  public boolean preHandle(
    HttpServletRequest request,
    HttpServletResponse response,
    Object handler) throws Exception {

    request.setCharacterEncoding("UTF-8");
    @SuppressWarnings("unchecked")
    Map < String, Menu > menus = (Map < String, Menu > ) cache.getFromCache("MENUMAP");

    User user = (User) request.getSession().getAttribute(Constants.ADMIN_USER);

    String storeCode = MerchantStore.DEFAULT_STORE;
    MerchantStore store = (MerchantStore) request.getSession().getAttribute(Constants.ADMIN_STORE);

    String userName = request.getRemoteUser();

    if (userName == null) { //** IMPORTANT FOR SPRING SECURITY **//
      //response.sendRedirect(new StringBuilder().append(request.getContextPath()).append("/").append("/admin").toString());
    } else {

      if (user == null) {
        user = userService.getByUserName(userName);
        request.getSession().setAttribute(Constants.ADMIN_USER, user);
        if (user != null) {
          storeCode = user.getMerchantStore().getCode();
        } else {
          LOGGER.warn("User name not found " + userName);
        }
        store = null;
      }

      if (user == null) {
        response.sendRedirect(request.getContextPath() + "/admin/unauthorized.html");
        return true;
      }

      if (!user.getAdminName().equals(userName)) {
        user = userService.getByUserName(userName);
        if (user != null) {
          storeCode = user.getMerchantStore().getCode();
        } else {
          LOGGER.warn("User name not found " + userName);
        }
        store = null;
      }

    }

    if (store == null) {
      store = merchantService.getByCode(storeCode);
      request.getSession().setAttribute(Constants.ADMIN_STORE, store);
    }
    request.setAttribute(Constants.ADMIN_STORE, store);

    Language language = languageUtils.getRequestLanguage(request, response);

    if (language == null) {

      //TODO get the Locale from Spring API, is it simply request.getLocale() ???
      //if so then based on the Locale language locale.getLanguage() get the appropriate Language
      //object as represented below
      if (user != null) {
        language = user.getDefaultLanguage();
        if (language == null) {
          language = store.getDefaultLanguage();
        }
      } else {
        language = store.getDefaultLanguage();
      }

      request.getSession().setAttribute("LANGUAGE", language);

    }

    request.setAttribute(Constants.LANGUAGE, language);

    if (menus == null) {
      InputStream in = null;
      ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
      try {
        in =
        this.getClass().getClassLoader().getResourceAsStream("admin/menu.json");

        Map < String, Object > data = mapper.readValue( in , Map.class);

        Menu currentMenu = null;

        menus = new LinkedHashMap < String, Menu > ();
        List objects = (List) data.get("menus");
        for (Object object: objects) {
          Menu m = getMenu(object);
          menus.put(m.getCode(), m);
        }

        cache.putInCache(menus, "MENUMAP");

      } catch (JsonParseException e) {
        LOGGER.error("Error while creating menu", e);
      } catch (JsonMappingException e) {
        LOGGER.error("Error while creating menu", e);
      } catch (IOException e) {
        LOGGER.error("Error while creating menu", e);
      } finally {
        if ( in != null) {
          try {
            in .close();
          } catch (Exception ignore) {
            // TODO: handle exception
          }
        }
      }

    }

    List < Menu > list = new ArrayList < Menu > (menus.values());

    request.setAttribute("MENULIST", list);

    request.setAttribute("MENUMAP", menus);
    response.setCharacterEncoding("UTF-8");

    return true;
  }

  private Menu getMenu(Object object) {

    Map o = (Map) object;
    Map menu = (Map) o.get("menu");

    Menu m = new Menu();
    m.setCode((String) menu.get("code"));

    m.setUrl((String) menu.get("url"));
    m.setIcon((String) menu.get("icon"));
    m.setRole((String) menu.get("role"));

    List menus = (List) menu.get("menus");
    if (menus != null) {
      for (Object oo: menus) {

        Menu mm = getMenu(oo);
        m.getMenus().add(mm);
      }

    }

    return m;

  }

}
ở đâu vậy bác
 
Sao ko dùng tool cho nhanh.
Trong cuốn 300 bài code thiếu nhi nó có nhắc đến tool auto-AI-review rồi mà
qY6rFcT.png
 
Sao ko dùng tool cho nhanh.
Trong cuốn 300 bài code thiếu nhi nó có nhắc đến tool auto-AI-review rồi mà
qY6rFcT.png
auto- AI - review thì cũng sữa đc mấy lỗi syntax thôi còn lỗi logic, performance kém làm sao nó hiểu được :(
Ps: Đưa đoạn code ko chú thích làm gì, ko biết review về gì, ko highlight syntax, comment vài dòng. quăng lên stackoverflow xem nó có buồn đọc ko
 
Sửa lần cuối:
ở đâu vậy bác
1/refactor giảm nested if else.
2/nên áp dụng return early pattern.
3/1 hàm quá dài, nên refactor thành những hàm nhỏ hơn.
4/hạn chế chain call như này request.getSession().getAttribute(Constants.ADMIN_USER);
5/ hàm getMenu không nên đặt tên biến theo abbreviation. Tên biến phải là self-explanatory.
 
Mã:
    if (user == null) {
        user = userService.getByUserName(userName);
        request.getSession().setAttribute(Constants.ADMIN_USER, user);
        if (user != null) {
          storeCode = user.getMerchantStore().getCode();
        } else {
          LOGGER.warn("User name not found " + userName);
        }
        store = null;
      }

      if (user == null) {
        response.sendRedirect(request.getContextPath() + "/admin/unauthorized.html");
        return true;
      }

Những đoạn code thế này tìm mọi cách né nha thím, một trong những điểm để thấy đã lên senior hay chưa.
  • user được xài tới lui nhiều lần với ngũ cảnh khác nhau (một cái lấy từ session, một cái từ db, đại loại thế)
  • if(user==null) rồi bên trong lookup rồi lại check !=null, đọc dễ ngáo.
  • Trên check ==null rồi xuống dưới lại check tiếp, dù biết rằng nó đã dc thay đổi, nhưng nhìn vẫn ngáo.

Import sắp xếp lại nha bác, theo đúng thứ tự. Recommend là java và javax trước, sau đó là theo alphabet (com, org, etc)

Nói chung còn nhiều, thôi cứ từ từ.
 
code rất rờm rà, dài dòng trong khi logic thì chỉ có tý tẹo
cố bôi code ra càng dài thì khả năng xuất hiện lỗi càng tăng :sneaky:
 
Sau khi nhìn vào phần điều kiện trong code java của anh trên thì tôi đã biết tôi nên học lại logic trong toán rời rạc rồi
 
Java:
if (userName == null)
    } else {
      if (user == null) {
        if (user != null) {
        } else {
        }
        store = null;
      }
      if (user == null)
...
cái này là phức tạp hoá vấn đề đúng không :eek:
để chữa bệnh này thì cần sắp xếp lại cái tư duy về logic của thớt, cấu trúc thế này là dở rồi
Mã:
 

Thống kê chủ đề

Ngày tạo
tranhungajc,
Người trả lời cuối
Yurisha,
Trả lời
21
Lượt xem
3.127
Quay lại
Lên đầu trang