2016-06-27 1 views
-1

Я несколько раз читал, что ключевое слово new, лежащее где-нибудь в вашем коде, является запахом кода и затрудняет тестирование. Вот фрагмент кода, я работаю над:Как сделать данный код более надежным?

private void uploadTagsToCloudStorage(Optional<String> filename, String tags) throws IOException { 
    if (!filename.isPresent()) { 
     return; 
    } 
    GcsFilename gcsfilename = new GcsFilename(gcsBucketName, filename.get()); 
    GcsFileOptions options = 
     new GcsFileOptions.Builder().mimeType("text/html").acl("public-read").build(); 
    try (GcsOutputChannel writeChannel = gcsService.createOrReplace(gcsfilename, options)) { 
     PrintWriter gcswriter = 
      new PrintWriter(Channels.newWriter(writeChannel, StandardCharsets.UTF_8.toString())); 
     gcswriter.println(decode(tags)); 
     gcswriter.flush(); 
     writeChannel.waitForOutstandingWrites(); 
    } 
    } 

Я использую Guice впрыснуть gcsService, но до сих пор я вижу много new ключевых слов вокруг. Я страдаю от плохого дизайна? или такой сценарий неизбежен?

+0

Использование 'new' в C++ обычно является запахом кода. Я не слышал этого руководства для Java. – NathanOliver

+1

Не знаете, откуда эти другие люди получают информацию, но, конечно, использование ** нового ** имеет ** основное ** влияние на то, как легко проверить ваш код. Все, кто говорит что-то еще ... извините, ребята, где вы провели последние 10 лет. Просто указывая, что https://www.youtube.com/playlist?list=PLD0011D00849E1B79 (esp video 2) 10 лет назад ясно дал понять, почему «неразумное» использование «нового» полностью нарушает вашу способность выполнять модульные тесты. – GhostCat

+0

@ user1803551 См. Https://www.youtube.com/playlist?list=PLD0011D00849E1B79 ... видео нет. 2 дает вам очень подробное представление о «новых проблемах». И обратите внимание: это похоже на 10-летнее знание. – GhostCat

ответ

1

Использование «нового» для создания объектов затрудняет тестирование, потому что вы не можете легко изменить между различными реализациями. Dependency Injection позволяет вам, например, изменять между mock gcsService или реальным gcsService impl без переписывания кода.

На вашем примере ни одно новое GcsFilename() и новый PrintWriter() не изменится, поэтому я не вижу проблемы при использовании «нового». GcsFileOptions.Builder() .. build() выглядит как статический метод, вам не нужно «новое», чтобы получить параметры.