1. Java / Говнокод #8172

    +80

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    public class Context {
        public int countSuccess;
        public int countFailed;
        // ....
        public void markSuccess() {
            countSuccess++;
            countFailed--;
        }
    
        public void markSuccessAll() {
            countSuccess += countFailed;
            countFailed = 0;
        }   
        // ....
    }

    Вот такая вот супер-абстракция. Пример клиентского кода:

    public void processRequest(Context ctx) {
    // ...
    ctx.countFailed = elems.size();
    for (String elem : elems) {
    boolean success = doSomething(elem);
    if (success) {
    ctx.markSuccess();
    }
    }
    }

    Запостил: roman-kashitsyn, 12 Октября 2011

    Комментарии (8) RSS

    • И что в этом плохого? Ну кроме public-полей. (Вообще считаю, что по умолчанию в ООП всё должно быть private и final/const.)
      Ответить
      • 1. Два счётчика. Очевидное простое решение для этой модели - totalCount и successCount. successCount растёт up to totalCount. Я вот не сразу догнал, почему у нас сразу все элементы failed.
        2. Public-поля. Без комментариев.
        Ответить
        • Первое следствие второго. Были бы поля спрятаны за методы доступа — никому бы и дела не было.
          Ответить
          • Не совсем. Пусть поля private и есть get/set-тэры. Имеем такой-же таинственный код
            ctx.setCountFailed(elems.size());
            Ответить
    • Выглядит, как будто от какого-то класса оторвали зачем-то кусок и выделили этот кровавый шмат мяса в отдельный класс
      Ответить
    • public final class Context {
      	private final int totalCount;
      	private int successCount;
      
      	public Context(final int totalCount) {
      		this.totalCount = totalCount;
      	}
      
      	public void markSuccess() {
      		if (successCount < totalCount) {
      			successCount++;
      		} else {
      			throw new AssertionError("Attempt to have more successes than total items");
      		}
      	}
      
      	public void markSuccessAll() {
      		successCount = totalCount;
      	}   
      	
      	public int getTotalCount() {
      		return totalCount;
      	}
      	
      	public int getSuccessCount() {
      		return successCount;
      	}
      	
      	public int getFailedCount() {
      		return totalCount - successCount;
      	}
      }


      Фиксед?
      Ответить
      • Практически. К сожалению, на этапе конструкции Context totalCount не известен. В принципе, будь задача чуть серьёзнее, функционал подсчёта можно было бы выделить во вложенный класс, инстанс которого создавался бы контекстом. А так вполне сойдёт сеттер для totalCount.
        Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий