Django Как рефакторить дублирующий метод
Я использую django 2.2 и в моем представлении есть две функции, которые делают одно и то же, но меняется только один элемент. Я хотел бы попытаться улучшить свой код, чтобы не повторять одно и то же большее количество раз, в основном сделать то, что делает функция vm_schedule_power_on_vm
и
vm_schedule_power_off_vm
в одну функцию. Единственное, что изменится, это вызов vmware_poweron
в функции vm_schedule_power_on_vm
и vmware_poweroff
в функции vm_schedule_power_off_vm
.
path('vm/schedule/<int:pk>/powered_on/', vm.vm_schedule_power_on_vm,
name='vm_schedule_power_on_vm'),
path('vm/schedule/<int:pk>/powered_off/', vm.vm_schedule_power_off_vm,
name='vm_schedule_power_off_vm')
def vm_schedule_power_on_vm(request, pk):
sch = VmSchedule.objects.get(pk=pk)
mylistvm, mylist = list(), list()
mydate = time.strftime("%d/%m/%Y")
for i in sch.vms.all():
if i.lock:
return 'locked'
# here the order has importance because
# I try to have the start time and at the end the end time.
mylist.append(mydate)
mylist.append(time.strftime("%H:%M:%S"))
mylist.append(i.name)
mylist.append(i.vmware.hostname)
# only this line changes each time
mylist.append(vmware_poweron(i))
mylist.append(time.strftime("%H:%M:%S"))
mylist.append(sch.schedule)
mylistvm.append(mylist)
mylist = list()
vm_logs_export(mylistvm)
return HttpResponse(json.dumps(mylistvm))
def vm_schedule_power_off_vm(request, pk):
sch = VmSchedule.objects.get(pk=pk)
mylistvm, mylist = list(), list()
mydate = time.strftime("%d/%m/%Y")
for i in sch.vms.all():
if i.lock:
return 'locked'
mylist.append(mydate)
mylist.append(time.strftime("%H:%M:%S"))
mylist.append(i.name)
mylist.append(i.vmware.hostname)
# only this line changes each time
mylist.append(vmware_poweroff(i))
mylist.append(time.strftime("%H:%M:%S"))
mylist.append(sch.schedule)
mylistvm.append(mylist)
mylist = list()
vm_logs_export(mylistvm)
return HttpResponse(json.dumps(mylistvm))
# Example result of vm_schedule_power_on_vm or vm_schedule_power_off_vm
['09/12/2021', '13:54:33', 'API1VTEST11', 'ste1vvcsa', '13:54:33', 'testPowredOn02',
'09/12/2021', '13:54:33', 'API1VTEST12', 'ste1vvcsa', '13:54:33', 'testPowredOn02',
'09/12/2021', '13:54:33', 'API1VTEST2', 'ste1vvcsa', '13:54:33', 'testPowredOn02']
def vmware_poweron(vm):
#return list of something
def vmware_poweroff(vm):
#return list of something
# Example result of vmware_poweron or vmware_poweroff
[["09/12/2021", "13:54:33", "API1VTEST11", "ste1vvcsa", "13:54:33", "testPowredOn02",
"09/12/2021", "13:54:33", "API1VTEST12", "ste1vvcsa", "13:54:33", "testPowredOn02",
"09/12/2021", "13:54:33", "API1VTEST2", "ste1vvcsa", "13:54:33", "testPowredOn02"]
Проще всего извлечь общие операции в более общую функцию, например vm_schedule_power_operation
. Дайте ей третий параметр, operation
, и передайте в качестве этого параметра либо vmware_poweron
, либо vmware_poweroff
.
Когда вы дойдете до строки, изменяющей функцию, измените эту строку, чтобы вызвать operation(i)
вместо vmware_poweron
или vmware_poweroff
непосредственно.
Тогда ваши функции on
/off
могут выглядеть следующим образом:
def vm_schedule_power_on_vm(request, pk):
vm_schedule_power_operation(request, pk, vmware_poweron)
def vm_schedule_power_off_vm(request, pk):
vm_schedule_power_operation(request, pk, vmware_poweroff)