Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Гексагональная архитектура в приложениях Django

Гексагональная архитектура в приложениях Django

Как не превратить свой проект в груду урлов? Как не потерять расширяемость с ростом кодовой базы? Как писать поддерживаемый код? Об этих проблемах и их возможных решениях на примере Django расскажет и покажет Малышев Артем.

Moscow Python Meetup №30

Avatar for Moscow Python Meetup

Moscow Python Meetup

November 19, 2015
Tweet

More Decks by Moscow Python Meetup

Other Decks in Technology

Transcript

  1. КОМУ-ТО БЫЛО ЛЕНЬ ПИСАТЬ CUSTOM MANAGER def make_report(request, pk): request.GET

    = request.GET.copy() request.GET['foo'] = 'bar' response = another_report(request, pk) return render(request, 'report.html', context=response.context_data)
  2. А ЕЩЁ ПОЛОЖИЛ ЛОГИКУ В ШАБЛОНЫ, ЧТО ЕЙ ТАМ БУДЕТ...

    {% for i, j, k in rows %} <tr> <td>{{ i }}</td> <td>{{ j }}</td> <td>{{ i|add:j }}</td> </tr> {% endfor %}
  3. .

  4. .

  5. .

  6. . TOM CHRISTIE As codebases grow it becomes difficult to

    make any cast-iron guarantees that you really are enforcing application-level data integrity. DJANGO MODELS, ENCAPSULATION AND DATA INTEGRITY
  7. MVC ФРЕЙМВОРКИ ХОРОШО ПОДХОДЯТ ДЛЯ CRUD ПРИЛОЖЕНИЙ class PublisherList(ListView): model

    = Publisher context_object_name = 'publishers' class PublisherDetail(DetailView): queryset = Publisher.objects.all() context_object_name = 'publisher'
  8. ГЕКСАГОНАЛЬНАЯ АРХИТЕКТУРА Позволяет взаимодействовать с приложением как пользователю, так и

    программам, автоматическим тестам, скриптам пакетной обработки. Также позволяет приложению быть разработанным и оттестированным без каких- либо дополнительных устройств или баз данных.
  9. .

  10. USE CASE class Purchase(UseCase): @boundary_method def start(user_name, product_name): user =

    self.get_user(user_name) product = self.get_product(product_name) if product.allowed_for(user): self.success.ask_for_confirmation() else: self.failure.impossible_purchase()
  11. USE CASE def get_product(self, product_name): try: product = self.products.by_name(product_name) except

    NotAvailable: self.failure.product_not_available() else: return product
  12. .

  13. READING Robert Martin. Architecture: The lost years Chris Fidao. Hexagonal

    Architecture Николай Рыжиков. Use Case Driven Development Кирилл Мокевнин. Ментальное программирование