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)
Вернуться на верх