Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 13.04.2020
Сообщений: 3

Рефакторинг кода

13.04.2020, 16:30. Показов 557. Ответов 3

Студворк — интернет-сервис помощи студентам
Имеется следующий код, который не очень хорошо написан. Он содержит две проблемы, которые смешаны - бизнес-логику и логирование. Как отрефакторить код так, чтобы было три отдельных части: часть, содержащая бизнес-логику, часть, которая создает строки, и часть, которая выводит их на экран.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from itertools import count
 
class Reservation(object):
    _ids = count(0)
    
    def __init__(self, from_, to, book, for_):
        self._id = next(Reservation._ids)
        self._from = from_
        self._to = to    
        self._book = book
        self._for = for_
        self._changes = 0
        print(F'Created a reservation with id {self._id} of {self._book} '+
              F'from {self._from} to {self._to} for {self._for}.')
 
    def overlapping(self, other):
        ret = (self._book == other._book and self._to >= other._from 
               and self._to >= other._from)
        str = 'do'
        if not ret:
            str = 'do not'
        print(F'Reservations {self._id} and {other._id} {str} overlap')
        return ret
            
    def includes(self, date):
        ret = (self._from <= date <= self._to)
        str = 'includes'
        if not ret:
            str = 'does not include'
        print(F'Reservation {self._id} {str} {date}')
        return ret        
        
    def identify(self, date, book, for_):
        if book != self._book: 
            print(F'Reservation {self._id} reserves {self._book} not {book}.')
            return False
        if for_!=self._for:
            print(F'Reservation {self._id} is for {self._for} not {for_}.')
            return False
        if not self.includes(date):
            print(F'Reservation {self._id} is from {self._from} to {self._to} which '+
                  F'does not include {date}.')
            return False
        print(F'Reservation {self._id} is valid {for_} of {book} on {date}.')
        return True        
        
    def change_for(self, for_):
        print(F'Reservation {self._id} moved from {self._for} to {for_}')
        self._for = for_
        
 
class Library(object):
    def __init__(self):
        self._users = set()
        self._books = {}   #maps name to count
        self._reservations = [] #Reservations sorted by from
        print(F'Library created.')
                
    def add_user(self, name):
        if name in self._users:
            print(F'User not created, user with name {name} already exists.')
            return False
        self._users.add(name)
        print(F'User {name} created.')
        return True
 
    def add_book(self, name):
        self._books[name] = self._books.get(name, 0) + 1
        print(F'Book {name} added. We have {self._books[name]} coppies of the book.')
 
    def reserve_book(self, user, book, date_from, date_to):
        book_count = self._books.get(book, 0)
        if user not in self._users:
            print(F'We cannot reserve book {book} for {user} from {date_from} to {date_to}. '+
                  F'User does not exist.')
            return False
        if date_from > date_to:
            print(F'We cannot reserve book {book} for {user} from {date_from} to {date_to}. '+
                  F'Incorrect dates.')
            return False
        if book_count == 0:
            print(F'We cannot reserve book {book} for {user} from {date_from} to {date_to}. '+
                  F'We do not have that book.')
            return False
        desired_reservation = Reservation(date_from, date_to, book, user)
        relevant_reservations = [res for res in self._reservations
                                 if desired_reservation.overlapping(res)] + [desired_reservation]
        #we check that if we add this reservation then for every reservation record that starts 
        #between date_from and date_to no more than book_count books are reserved.
        for from_ in [res._from for res in relevant_reservations]:
            if desired_reservation.includes(from_):
                if sum([rec.includes(from_) for rec in relevant_reservations]) > book_count:
                    print(F'We cannot reserve book {book} for {user} from {date_from} '+
                          F'to {date_to}. We do not have enough books.')
                    return False
        self._reservations+=[desired_reservation]
        self._reservations.sort(key=lambda x:x._from) #to lazy to make a getter
        print(F'Reservation {desired_reservation._id} included.')
        return True
 
    def check_reservation(self, user, book, date):
        res = any([res.identify(date, book, user) for res in self._reservations])
        str = 'exists'
        if not res:
            str = 'does not exist'
        print(F'Reservation for {user} of {book} on {date} {str}.')
        return res        
 
    def change_reservation(self, user, book, date, new_user):
        relevant_reservations = [res for res in self._reservations 
                                     if res.identify(date, book, user)]
        if not relevant_reservations:        
            print(F'Reservation for {user} of {book} on {date} does not exist.')
            return False
        if new_user not in self._users:
            print(F'Cannot change the reservation as {new_user} does not exist.')
            return False
            
        print(F'Reservation for {user} of {book} on {date} changed to {new_user}.')        
        relevant_reservations[0].change_for(new_user)
        return True
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.04.2020, 16:30
Ответы с готовыми решениями:

Рефакторинг кода, нужны комментарии для каждой строчки кода
Закомментировать каждую строчку кода !pip install pycountry_convert import warnings import numpy as np import pandas as pd ...

Рефакторинг кода
Добрый день. Нужна помощь опытных “питонистов” Я создал метод, код ниже, который скорее всего можно хорошенько сократить и сделать его...

Рефакторинг кода: вложенный цикл for
Добрый день! Хотелось бы увидеть от коллег, как они делают рефакторинг кода. Вот, накидал такой кусочек: lst = new_lst = ...

3
6 / 5 / 1
Регистрация: 25.03.2020
Сообщений: 36
13.04.2020, 16:48
Напишите подробнее о коде, комментариев мало...что делает, и какая бизнес логика? если хотите быстрого ответа конечно...
И надо понимать для чего вы хотите разделение кода, который в принципе состоит из функций. И что в вашем понимании разделение? надо сделать разные файлы?

Добавлено через 9 минут
Думаю стоит разделить код на три файла, по принципу проектов python. У каждого файла соответствующий функционал. Логику приложения вы лучше знаете, поэтому сможете быстро разделить код. Он в принципе состоит из классов, думаю это сделать не сложно.
0
0 / 0 / 0
Регистрация: 13.04.2020
Сообщений: 3
13.04.2020, 17:02  [ТС]
Цитата Сообщение от Gebekov-MP Посмотреть сообщение
Напишите подробнее о коде, комментариев мало...что делает, и какая бизнес логика? если хотите быстрого ответа конечно...
И надо понимать для чего вы хотите разделение кода, который в принципе состоит из функций. И что в вашем понимании разделение? надо сделать разные файлы?

Добавлено через 9 минут
Думаю стоит разделить код на три файла, по принципу проектов python. У каждого файла соответствующий функционал. Логику приложения вы лучше знаете, поэтому сможете быстро разделить код. Он в принципе состоит из классов, думаю это сделать не сложно.
Извините, не дописала некоторую информацию по таску. Код следует отрефакторить для его лучшего восприятия, тк следующим заданием является написание юнит-тестов для отрефакторенных классов. Вдобавок, нужно написать несколько тестов для функционала, который отвечает за обработку строк.
0
6 / 5 / 1
Регистрация: 25.03.2020
Сообщений: 36
13.04.2020, 17:38
Думаю вам стоит выставить этот таск на фриланс...потому что это не помощь получается, а надо все сделать...плюс нет объяснения и комментариев по коду
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2020, 17:38
Помогаю со студенческими работами здесь

Рефакторинг кода
Всем известно, что методы должны содержать 5-7 операторов, лучше 3. Но если я в методе обрабатываю исключения и их много (5 к примеру), то...

Рефакторинг кода
Добрый день. Есть код, он работает, но проблема в том,что его много, как можно сделать рефакторинг кода.В последних 2х функция объявление и...

Рефакторинг кода
Здравствуйте, есть функция private void draw() { if (color2_bt0.IsChecked == true) { drawingBrush = Brushes.Black; ...

Рефакторинг кода
Добрый день, помогите сделать рефакторинг - что можно улучшить? @{ ViewBag.Title = &quot;Каталог товаров&quot;; } &lt;div...

Рефакторинг кода.
Доброго всем дня. помогите упростить кусок кода с if. Первая секция - две строки При нажатии на каждую - раскрываются в список, при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru