Какие способы существуют для устранения дублирования кода?

Я обрабатываю текст с помощью скрипта и использую разные подходы в зависимости от его размера: если текст большой, я обрабатываю его по частям (чанками), иначе - целиком. В предоставленном коде видно, что в обоих случаях выполняются почти одинаковые операции, и мне трудно понять, как вынести этот повторяющийся код в отдельную функцию, чтобы сделать его более чистым и понятным. Не подскажете, как это лучше реализовать, или можете порекомендовать статьи или книги на эту тему?
  • 2 октября 2024 г. 13:44
Ответы на вопрос 3
Существует несколько эффективных способов устранения дублирования кода. В вашем случае, когда вы обрабатываете текст по частям или целиком, можно использовать подход с вынесением общего кода в отдельные функции. Вот некоторые рекомендации:

1. **Создание функции для общей логики**: Выделите операции, которые выполняются в обоих случаях, в отдельную функцию. Она будет принимать необходимые параметры, такие как текст или части текста, и обработает их. Например:

   ```python
   def process_text(text):
       # Здесь помещаем общую логику обработки текста
       processed_text = text.lower()  # Пример обработки
       # Другие операции
       return processed_text
   ```

   Затем в вашем основном коде вы можете вызывать эту функцию:

   ```python
   if len(text) > threshold:
       for chunk in chunkify(text):
           result = process_text(chunk)
           # Обработка результата
   else:
       result = process_text(text)
       # Обработка результата
   ```

2. **Использование параметров**: Если ваши подходы несколько отличаются в зависимости от размера текста, можно использовать параметры для настройки поведения обработчика. Например:

   ```python
   def process_text(text, mode='full'):
       if mode == 'chunk':
           # Специфическая обработка для чанков
           pass
       else:
           # Полная обработка
           pass
       return processed_text
   ```

3. **Шаблоны проектирования**: Рассмотрите возможность применения шаблонов проектирования, таких как "Стратегия" или "Шаблонный метод", которые позволяют определить алгоритмы и их использование в зависимости от условий.

4. **Улучшение структуры кода**: Если приложение растет, стоит подумать о более структурированном подходе, например, выделить классы или модули, которые обрабатывают текст разными способами.

### Ресурсы для изучения

Для глубокого понимания принципов устранения дублирования кода и других аспектов чистого кода, вот некоторые рекомендованные книги и статьи:

1. **"Чистый код" (Clean Code)** - Роберт Мартин (Robert C. Martin). Классическая книга о том, как писать чистый и понятный код.
  
2. **"Refactoring: Improving the Design of Existing Code"** - Мартин Фаулер (Martin Fowler). Книга, посвященная рефакторингу кода и улучшению его структуры.

3. **"The Pragmatic Programmer"** - Эндрю Хант и Дэвид Томас. Полезные идеи и советы по всему спектру разработки ПО.

4. **Статьи на сайте Martin Fowler** - [martinfowler.com](https://martinfowler.com). Много полезной информации о рефакторинге и чистом коде.

Следуя этим рекомендациям и изучая указанные ресурсы, вы сможете значительно улучшить качество вашего кода и устранить дублирование.
Если правильно понял Ваш вопрос: 
result_json = 0
def someth(a):
    answer = get_answer(text,
                        tags_quantity=a)
    tmp_json = parse_answer(answer)
    result_json['summary_text'] = tmp_json['result']
    result_json['tags'].extend(tmp_json['tags'])
    result_json['input_size'] = answer.input_size
    result_json['output_size'] = answer.output_size
……………
if size > max_size:
    chunker = TextChunker(maxlen=max_size)
    for chunk in chunker.chunk(text):
      result_json =  someth(3)
else:
     result_json =  someth(1)
return result_json
Как вариант (>=Python3.10): 
from typing import Dict, Any

def process(answer, result_json: Dict[str, Any]) -> None:
    tmp_json = parse_answer(answer)
    result_json['summary_text'] += tmp_json['result']
    result_json['tags'].extend(tmp_json['tags'])
    result_json['input_size'] += answer.input_size
    result_json['output_size'] += answer.output_size

def handler(text: str, max_size: int) -> Dict[str, Any]:
    result_json = {'summary_text': '', 'tags': [], 'input_size': 0, 'output_size': 0}

    match len(text):
        case size if size > max_size:
            chunker = TextChunker(maxlen=max_size)
            for chunk in chunker.chunk(text):
                answer = get_answer(chunk, tags_quantity=1)
                process(answer, result_json)
        case _:
            answer = get_answer(text, tags_quantity=3)
            process(answer, result_json)

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