Я обрабатываю текст с помощью скрипта и использую разные подходы в зависимости от его размера: если текст большой, я обрабатываю его по частям (чанками), иначе - целиком. В предоставленном коде видно, что в обоих случаях выполняются почти одинаковые операции, и мне трудно понять, как вынести этот повторяющийся код в отдельную функцию, чтобы сделать его более чистым и понятным. Не подскажете, как это лучше реализовать, или можете порекомендовать статьи или книги на эту тему?
Существует несколько эффективных способов устранения дублирования кода. В вашем случае, когда вы обрабатываете текст по частям или целиком, можно использовать подход с вынесением общего кода в отдельные функции. Вот некоторые рекомендации:
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