2012-01-24 1 views
-2

Мне было предложено работать над этим плановым заданием, которое экспортирует некоторые данные клиентов (из базы данных электронной коммерции) в текстовый файл пользовательского формата. Следующий код - это то, что я нашел.Данные экспорта Java в текстовый файл (custom-format)

Я просто хотел бы удалить все, но я не могу. Можно ли улучшить это, не меняя его?

public class AConverter implements CustomerConverter { 

    protected final Logger LOG = LoggerFactory.getLogger(AConverter.class); 

    private final static String SEPARATOR = ";"; 
    private final static String CR = "\n"; 

    public String create(Customer customer) { 

     if (customer == null) 
      return null; 

     LOG.info("Exporting customer, uidpk: {}, userid: {}", customer.getUidPk(), customer.getUserId()); 

     StringBuilder buf = new StringBuilder(); 

     buf.append("<HEAD>"); 
     buf.append(SEPARATOR); 
     buf.append(String.valueOf(customer.getUidPk())); 
     buf.append(SEPARATOR); 
     byte[] fullName = null; 
     try { 
      fullName = customer.getFullName().getBytes("UTF-8"); 
     } catch (UnsupportedEncodingException e1) { 
      fullName = customer.getFullName().getBytes(); 
     } 
     String name = null; 
     try { 
      name = new String(fullName, "UTF-8"); 
     } catch (UnsupportedEncodingException e) { 
      name = customer.getFullName(); 
     } 
     buf.append(limitString(name, 40)); 
     buf.append(SEPARATOR); 
     final CustomerAddress preferredShippingAddress = customer.getPreferredShippingAddress(); 
     if (preferredShippingAddress != null) { 
      final String street1 = preferredShippingAddress.getStreet1(); 
      if (street1 != null) { 
       buf.append(limitString(street1, 40)); 
      } 
     } else { 
      buf.append(" "); 
     } 
     buf.append(SEPARATOR); 

     final String addressStr = buildAddressString(customer); 
     buf.append(limitString(addressStr, 40)); 
     buf.append(SEPARATOR); 
     buf.append(limitString(customer.getEmail(), 80)); 
     buf.append(SEPARATOR); 
     if (preferredShippingAddress!=null && preferredShippingAddress.getStreet2() != null) { 
      buf.append(limitString(preferredShippingAddress.getStreet2(), 40)); 
     } else { 
      buf.append(" "); 
     } 
     buf.append(SEPARATOR); 
     buf.append(limitString(customer.getPhoneNumber(), 25)); 
     buf.append(SEPARATOR); 
     if (preferredShippingAddress!=null) { 
      if(preferredShippingAddress.getCountry()!=null) { 
       buf.append(preferredShippingAddress.getCountry()); 
      } else { 
       buf.append(" "); 
      } 
     } else { 
      buf.append(" "); 
     } 
     buf.append(SEPARATOR); 
     if (preferredShippingAddress!=null) { 
      if(preferredShippingAddress.getCountry()!=null) { 
       buf.append(preferredShippingAddress.getCountry()); 
      } else { 
       buf.append(" "); 
      } 
     } else { 
      buf.append(" "); 
     } 
     buf.append(SEPARATOR); 

     String fodselsnummer = " "; 
     try { 
      Map<String, AttributeValue> profileValueMap = customer.getProfileValueMap(); 
      AttributeValue attributeValue = profileValueMap.get("CODE"); 
      fodselsnummer = attributeValue.getStringValue(); 
     } catch (Exception e) { 
     } 
     buf.append(fodselsnummer); 
     buf.append(CR); 
     final String string = buf.toString(); 

     return string; 

    } 

    private String buildAddressString(Customer customer) { 
     final CustomerAddress preferredShippingAddress = customer.getPreferredShippingAddress(); 
     if (preferredShippingAddress != null) { 
      final String zipOrPostalCode = preferredShippingAddress.getZipOrPostalCode(); 
      final String city = preferredShippingAddress.getCity(); 
      if (zipOrPostalCode != null && city != null) { 
       return zipOrPostalCode + " " + city; 
      } else if(zipOrPostalCode == null && city != null) { 
       return city; 
      } else if(zipOrPostalCode != null && city == null) { 
       return zipOrPostalCode; 
      } 
     } 
     return " "; 
    } 

    private String limitString(String value, int numOfChars) { 
     if (value != null && value.length() > numOfChars) 
      return value.substring(0, numOfChars); 
     else 
      return value; 
    } 

} 
+5

Какие у вас проблемы с кодом? Что вы хотите улучшить? Мы не будем анализировать код для вас. – madth3

+0

все эти попытки-ловушки ... эти пустые контрольные ... это просто выглядит плохо. я не просил вас анализировать его. – user1168098

+0

Если вы укажете области, которые хотите улучшить, мы можем переместить их в Code Review, который лучше подходит для такого типа вопросов. – casperOne

ответ

0

Вы говорите, что хотите его улучшить, вы хотите удалить его, но вы не можете. Я не уверен, почему ты не можешь. Я также не понимаю, почему вы хотите удалить его. Но это звучит для меня как отношение, которое я имел раньше, чем прочитал Рефакторинг от Мартина Фаулера. Я бы настоятельно предложил вам прочитать эту книгу, если вы этого еще не сделали.

Это, безусловно, возможно улучшить этот код (или любой код) без перезаписи всего. Наиболее очевидными улучшениями были бы устранение некоторых повторяющихся кодов в методе create путем создания некоторых методов утилиты, а затем разбиение метода create на несколько более мелких методов по шаблонам.

Кроме того, существует сомнительный бит кода в методе create, который превращает имя клиента в поток байтов UTF-8, а затем обратно в строку. Я не могу представить, для чего это. Наконец, он возвращает null, если клиент имеет значение null. Это вряд ли будет необходимо или мудро.

Для удовольствия я решил сделать небольшой рефакторинг по этому коду. (Обратите внимание, что правильный рефакторинг включает в себя модульные тесты, у меня нет никаких тестов для этого кода и даже не скомпилирован код ниже, а тем более его протестирован.) Вот один из возможных способов переписать этот код:

public class AConverter implements CustomerConverter { 
    protected final Logger LOG = LoggerFactory.getLogger(AConverter.class); 

    private final static String SEPARATOR = ";"; 
    private final static String CR = "\n"; 

    public String create(Customer customer) { 
     if (customer == null) throw new IllegalArgumentException("no cust"); 

     LOG.info("Exporting customer, uidpk: {}, userid: {}", 
       customer.getUidPk(), customer.getUserId()); 

     StringBuilder buf = new StringBuilder(); 
     doHead(buf, customer); 
     doAddress(buf, customer); 
     doTail(buf, customer); 
     return buf.toString(); 
    } 

    private void doHead(StringBuilder buf, Customer customer) { 
     append(buf, "<HEAD>"); 
     append(buf, String.valueOf(customer.getUidPk())); 
     append(buf, limitTo(40, customer.getFullName())); 
    } 

    private void doAddress(StringBuilder buf, Customer customer) { 
     append(buf, limitTo(40, street1of(customer))); 
     append(buf, limitTo(40, addressOf(customer))); 
     append(buf, limitTo(80, customer.getEmail())); 
     append(buf, limitTo(40, street2of(customer))); 
     append(buf, limitTo(25, customer.getPhoneNumber())); 
     append(buf, countryOf(customer)); 
     append(buf, countryOf(customer)); 
    } 

    private void doTail(StringBuilder buf, Customer customer) { 
     buf.append(fodselsnummerOf(customer)); 
     buf.append(CR); 
    } 

    private void append(StringBuilder buf, String s) { 
     buf.append(s).append(SEPARATOR); 
    } 

    private String street1of(Customer customer) { 
     final CustomerAddress shipto = customer.getPreferredShippingAddress(); 
     if (shipto == null) return " "; 
     if (shipto.getStreet1() != null) return shipto.getStreet1(); 
     return " "; 
    } 

    private String street2of(Customer customer) { 
     final CustomerAddress shipto = customer.getPreferredShippingAddress(); 
     if (shipto == null) return " "; 
     if (shipto.getStreet2() != null) return shipto.getStreet2(); 
     return " "; 
    } 

    private String addressOf(Customer customer) { 
     final CustomerAddress shipto = customer.getPreferredShippingAddress(); 
     if (shipto == null) return " "; 

     final String post = preferredShippingAddress.getZipOrPostalCode(); 
     final String city = preferredShippingAddress.getCity(); 

     if (post != null && city != null) return post + " " + city; 
     if (post == null && city != null) return city; 
     if (post != null && city == null) return post; 
     return " "; 
    } 

    private String countryOf(Customer customer) { 
     final CustomerAddress shipto = customer.getPreferredShippingAddress(); 
     if (shipto == null) return " "; 
     if (shipto.getCountry() != null) return shipto.getCountry(); 
     return " "; 
    } 

    private String limitTo(int numOfChars, String value) { 
     if (value != null && value.length() > numOfChars) 
      return value.substring(0, numOfChars); 
     return value; 
    } 

    private String fodelsnummerOf(Customer customer) { 
     try { 
      Map<String, AttributeValue> profileValueMap = 
       customer.getProfileValueMap(); 
      AttributeValue attributeValue = profileValueMap.get("CODE"); 
      return attributeValue.getStringValue(); 
     } catch (Exception e) { 
      return " "; 
     } 
    } 
} 

Я также заметил, что существует проблема с вашим форматом для текстового файла в специальном формате, если в любом из полей данных клиента (например, адрес электронной почты) есть точка с запятой, поскольку это ваш разделительный символ , Надеюсь, это известная проблема?

+0

спасибо большое @david conrad. это тот подход, который я хотел иметь. когда я сказал, что хотел бы удалить его, я, очевидно, имел в виду, что мне не нравилось видеть, что запутанный способ сделать что-то столь же просто, как BeanToString (возможно, не правильный способ его создания). Большое спасибо за вашу рефакторингу. выглядит намного яснее. я посмотрю на книгу. – user1168098

+0

Нет, наоборот, @ user1168098? –

+0

Видимо "Vote Up" требует 15 репутации – user1168098

Смежные вопросы