Эталонный пример рефакторинга?

Несколько лет назад в какой-то теме на Хабре мне попался комментарий со ссылкой на диф в репозитории Питона или одной из важных его библиотек. Его суть была в оптимизации порядка ~2000 строк в ~50. Он произвел на меня неизгладимое впечатление, и я не раз использовал его в обсуждениях соответствующих вопросов, но я каким-то чудом умудрился пролюбить эту ссылку. Возможно тут есть ярые сторонники этого языка, а может и сам автор коммита(комментария), которые смогут помочь.

Спасибо всем, но я хотел конкретную ссылку на коммит/ПР. К сожалению, я ее так и не получил. И мне нечего отметить решением.
  • Вопрос задан
  • 1348 просмотров
Пригласить эксперта
Ответы на вопрос 4
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Предлагаю вам накодить чего-нибудь на ~2000 строк и мы попробуем это отрефакторить=)
Только делайте это в github, чтобы удобнее было делать ревью.
Ответ написан
Комментировать
profesor08
@profesor08
Это очень субъективная штука, которая непостоянна, и меняется по мере развития технологии или сменой увлечений.

getSpecificData(data) {
    let result = [];

    for (let i = 0; i < data.length; i++) {
      if (...) {
        result.push(...);
      }
    }
  
    return data;
  }

  getSpecificData(data) {
    let result = [];

    data.forEach(item => {
      if (...) {
        result.push(...);
      }
    });

    return data;
  }

  getSpecificData(data) {
    return data.reduce((acc, item) => {
      if (...) {
        acc.push(...)
      }

      return acc;
    }, []);
  }


// три реакции на что-то там
reaction(
  () => state.search,
  search => {
    element1.classList.toggle("is-active", search.lenght > 0);
  },
);

reaction(
  () => state.items,
  items => {
    element2.classList.toggle("is-active", items.lenght > 0);
  },
);

reaction(
  () => state.data,
  data => {
    element3.classList.toggle("is-active", data.lenght > 0);
  },
);

// они же похожи, поэтому можно это отрефакторить до такого вида
const reactionToggle = (expression: any, element: HTMLElement) => {
  reaction(expression, (prop: boolean) => {
    element.classList.toggle("is-active", prop);
  });
};

reactionToggle(() => state.search, element1);
reactionToggle(() => state.items, element2);
reactionToggle(() => state.data, element3);
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
Много веков назад, Александрийской библиотеке грозило уничтожение, и все ее свитки решено было вывезти в безопасное место. Дорога шла через пустыню и была крайне трудной. Тяжело груженые верблюды не выдерживали и один за другим падали. Чтобы спасти содержание навсегда оставляемых книг, их переписывали, извлекая самое существенное. Когда пал последний верблюд, то все богатство огромной древней библиотеки свелось к записи: «Нет Бога, кроме Аллаха; и Магомет пророк его»

или еще короче:

5e18d0ffd4410666168913.jpeg
Ответ написан
Комментировать
@asd111
Такие рефакторинги в парсерах, компиляторах не редкость. Достаточно заменить сгенерированный код для большого конечного автомата под каждый вариант на цикл, в котором обрабатываются промежуточные варианты.
Чтобы было понятнее о чём идет речь посмотрите на шуточный калькулятор https://github.com/AceLewis/my_first_calculator.py...
Там 20 тыс строк которые тоже легко сократить.

Счастье не в количестве линий кода, а в скорости работы и потребляемой памяти.
Не редкость когда код из 1000 строк ест меньше памяти и работает быстрее чем код из 50. Потому что он cache friendly и многопоточный и т.п.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы