Django: Как оптимизировать и уменьшить повторяющийся код способом django? - PullRequest
0 голосов
/ 20 июня 2020

Я новичок в разработке и Django, все еще изучаю OOP, но я хотел узнать лучше с помощью некоторых примеров из кода, который я создал. Я создал функцию в своем файле просмотра. Функция становится очень длинной, и, вероятно, мне придется ее увеличить. Я думаю, что оператор if можно было бы написать как функцию, но не знаю, с чего начать. Каким образом можно было бы сократить код, чтобы его было легче поддерживать? Вот код:

def processView(request, pk):
    
    process = ProcessInfo.objects.get(id=pk)

    #bottlenecks = get_object_or_404(ProcessBottlenecks, process_info_id=process.id) 
    try:
        details = ProcessDetails.objects.get(process_info_id=process.id)        
    except ProcessDetails.DoesNotExist:
        details = None

    try:
        score = ProcessScoring.objects.get(process_score_id=pk)
    except ProcessScoring.DoesNotExist:
        score = None
    
    try:
        assumptions = ProcessAssumptions.objects.get(process_rel_process=process.id)       
    except ProcessAssumptions.DoesNotExist:
        assumptions = None
    
       
    color_bottleneck = None
    color_quality = None
    color_datacomplexity = None
    color_technology = None
    color_transformation = None
    color_driversforchange = None
    color_technology = None


    #B
    if score.tot_score_bottlenecks_scoring in range(0, 200):
        color_bottleneck = 'badge-primary'   
    if score.tot_score_bottlenecks_scoring in range(100, 500):
        color_bottleneck = 'badge-danger'
    if score.tot_score_bottlenecks_scoring in range(500, 1000):
        color_bottleneck = 'badge-warning'    
    if score.tot_score_bottlenecks_scoring >= 1000:
        color_bottleneck = 'badge-success'
        #P
    if score.tot_score_dataquality in range(0, 200):
        color_quality = 'badge-primary'   
    elif score.tot_score_dataquality in range(200, 500):
        color_quality = 'badge-danger'
    elif score.tot_score_dataquality in range(500, 100):
        color_quality = 'badge-warning'    
    elif score.tot_score_dataquality >= 1000:
        color_quality = 'badge-success'
        #D
    if score.tot_score_datacomplexity in range(0, 200):
        color_datacomplexity = 'badge-primary'   
    if score.tot_score_datacomplexity in range(200, 500):
        color_datacomplexity = 'badge-danger'
    if score.tot_score_datacomplexity in range(500, 1000):
        color_datacomplexity = 'badge-warning'    
    if score.tot_score_datacomplexity >= 1000:
        color_datacomplexity = 'badge-success'
        #TECHNOLOGY
    if score.tot_score_technology in range(0, 200):
        color_technology = 'badge-primary'   
    if score.tot_score_technology in range(200, 500):
        color_technology = 'badge-danger'
    if score.tot_score_technology in range(500, 1000):
        color_technology = 'badge-warning'    
    if score.tot_score_technology >= 1000:
        color_technology = 'badge-success'
        #T
    if score.tot_score_transformation in range(0, 200):
        color_transformation = 'badge-primary'   
    if score.tot_score_transformation in range(200, 500):
        color_transformation = 'badge-danger'
    if score.tot_score_transformation in range(500, 1000):
        color_transformation = 'badge-warning'    
    if score.tot_score_transformation >= 1000:
        color_transformation = 'badge-success'
        #DRIVERSFORCHANGE
    if score.tot_score_driversforchange in range(0, 200):
        color_driversforchange = 'badge-primary'   
    if score.tot_score_driversforchange in range(200, 500):
        color_driversforchange = 'badge-danger'
    if score.tot_score_driversforchange in range(500, 1000):
        color_driversforchange = 'badge-warning'    
    if score.tot_score_driversforchange >= 1000:
        color_driversforchange = 'badge-success'
        #S
    if score.tot_score_scalability in range(0, 200):
        color_scalability = 'badge-primary'   
    if score.tot_score_scalability in range(200, 500):
        color_scalability = 'badge-danger'
    if score.tot_score_scalability in range(500, 1000):
        color_scalability = 'badge-warning'    
    if score.tot_score_scalability >= 1000:
        color_scalability = 'badge-success'


    context ={
    'process':process,
    'details':details,
    'score':score,
    'assumptions':assumptions, 
    'color_bottleneck' : color_bottleneck,
    'color_quality':color_quality,
    'color_datacomplexity':color_datacomplexity,
    'color_technology':color_technology,
    'color_transformation' : color_transformation,
    'color_driversforchange':color_driversforchange, 
    'color_scalability' : color_scalability
    }
    return render(request, 'process/process_view.html', context)

Вот еще один пример из forms.py. Здесь у меня повторяются поля формы и создаются сотни строк

swivel= forms.CharField(
    label='Swivel Activities',
    required=False,
    help_text='Are swivel chair activities present?',
    widget=forms.Select(choices=CHECK))

process_objectives= forms.CharField(
    label='Clear Process Objectives',
    required=False,
    help_text='Are process outcomes objective and measurable?',
    widget=forms.Select(choices=CHECK))

stable_rules= forms.CharField(
    label='Stable Rules',
    required=False,
    help_text='Are the decision rules governing the process stable?',
    widget=forms.Select(choices=CHECK))

.....

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Вы можете выделить блок if как функцию:

badge_selecting(attribute):
    if attribute in range(0, 200):
        color = 'badge-primary'   
    elif attribute in range(100, 500):
        color = 'badge-danger'
    elif attribute in range(500, 1000):
        color = 'badge-warning'    
    elif attribute >= 1000:
        color = 'badge-success'

    return color

И вы вызываете функцию как:

color_bottleneck = badge_selection(score.tot_score_bottlenecks_scoring)

Для каждого атрибута.

ответ на вторую проблему такой же, поэтому вы можете создать такую ​​функцию, как:

def form_creation(label, help_text):
    form = forms.CharField(
    label=label,
    required=False,
    help_text=help_text,
    widget=forms.Select(choices=CHECK))

    return form

Если вам нужен вариант для других полей, но все же это атрибуты, которые вы хотите использовать в большинстве случаев , вы можете использовать значения аргументов по умолчанию и создать такую ​​функцию:

def form_creation(label, help_text, required=False, widget=forms.Select(choices=CHECK)):

Таким образом, вам не нужно помещать эти значения во все формы, только те, которые их изменяют.

1 голос
/ 20 июня 2020

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

def get_color(score):
  if score in range(0, 200):
      color = 'badge-primary'   
  elif score in range(100, 500):
      color = 'badge-danger'
  elif score in range(500, 1000):
      color = 'badge-warning'    
  else:
      color = 'badge-success'
  return color

color_scalability = get_color(score.tot_score_scalability)
color_transformation = get_color(score.tot_score_transformation)
...

когда вы повторяете себя, попробуйте найти общий подход. Надеюсь, это немного поможет, если у вас есть вопросы, спрашивайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...