paint-brush
Как найти ненужные части вашего кода [Часть XLVI]к@mcsee
635 чтения
635 чтения

Как найти ненужные части вашего кода [Часть XLVI]

к Maximiliano Contieri10m2023/11/27
Read on Terminal Reader

Слишком долго; Читать

Программисты-ковбои не следуют лучшим практикам. Они не следуют предложениям команды. Ковбойское программирование обычно считается непрофессиональным и рискованным подходом к разработке программного обеспечения, поскольку оно может привести к созданию кода, который будет сложно поддерживать и который подвержен ошибкам.
featured image - Как найти ненужные части вашего кода [Часть XLVI]
Maximiliano Contieri HackerNoon profile picture

Ваш код неприятен, потому что, вероятно, существует множество случаев, когда его можно было бы отредактировать или улучшить.


Большинство этих запахов — всего лишь намеки на что-то неладное. Следовательно, их не обязательно исправлять как таковые… (Хотя вам стоит над этим разобраться.)

Предыдущие запахи кода

Все предыдущие коды запахов (Часть I — XLV) вы можете найти здесь .


Давай продолжим...


Код запаха 226 — смешанные приоритеты

Еще один разбившийся космический корабль. Еще одна программная проблема


TL;DR: Разработайте и протестируйте программное обеспечение. Это дешевле, чем аппаратное обеспечение

Проблемы

Решения

  1. Создавайте точные симуляции
  2. Сделайте отказоустойчивое программное обеспечение

Контекст

Луна-25 упала на поверхность Луны 19 августа 2023 года.


За 4 дня до того, как индийский корабль «Чандраян-3» совершил мягкую посадку на южном полюсе Луны.


Судебно-медицинский анализ показал, что инструкции использовали общую шину и не были правильно расставлены по приоритетам.


Космические корабли имеют долгую историю сбоев в программном обеспечении.

Образец кода

Неправильный

 class TaskManager: def __init__(self): self.tasks = [] def add_task(self, task, priority): self.tasks.append((task, priority)) def execute_tasks(self): # No sorting for task, _ in self.tasks: task.execute() class Task: def __init__(self, name): self.name = name def execute(self): print(f"Executing task: {self.name}") task_manager = TaskManager() highPriorityTask = Task("Slow down") mediumPriorityTask = Task("Take Photos") reviveKlaatu = Task("Klaatu barada nikto") # unsorted task_manager.add_task(mediumPriorityTask, 2) task_manager.add_task(highPriorityTask, 1) task_manager.add_task(reviveKlaatu, 3) task_manager.execute_tasks()

Верно

 class TaskManager: def __init__(self): self.tasks = [] def add_task(self, task, priority): self.tasks.append((task, priority)) def execute_tasks(self): # Sort tasks by priority (high to low) self.tasks.sort(key=lambda x: x[1], reverse=True) for task, _ in self.tasks: task.execute() class Task: def __init__(self, name): self.name = name def execute(self): print(f"Executing task: {self.name}") task_manager = TaskManager() highPriorityTask = Task("Slow down") mediumPriorityTask = Task("Take Photos") reviveKlaatu = Task("Klaatu barada nikto") # unsorted task_manager.add_task(mediumPriorityTask, 2) task_manager.add_task(highPriorityTask, 1) task_manager.add_task(reviveKlaatu, 3) task_manager.execute_tasks()

Обнаружение

  • [x] Руководство

Это дизайнерский запах

Теги

  • Надежность

Заключение

Создавайте программные компоненты и моделируйте реальные и нереальные условия.

связи

Код запаха 198 — Скрытые предположения

Больше информации

Отказ от ответственности

Код Запахи — это мое мнение .


Аналитическая машина не претендует на создание чего-либо. Он может делать все, что мы знаем, как ему приказать… Но он, скорее всего, окажет косвенное и взаимное влияние на саму науку.


Ада Лавлейс

Великие цитаты о программной инженерии


Код запаха 227 — ковбойское кодирование

Оставьте ковбоев голливудским фильмам.


TL;DR: Пишите код как командный программист

Проблемы

  • Читабельность
  • Ненадежный код
  • Проблемы управления людьми
  • Отсутствие координации

Решения

  1. Пишите профессиональный код.


  2. Используйте декларативные незашифрованные имена.

Контекст

Программисты-ковбои не следуют лучшим практикам.


Они не следуют предложениям команды.


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


Программисты-ковбои — хорошие люди; однако они не могут работать в группе .

Образец кода

Неправильный

 # Very simple example # Compute the sum of two numbers without any structure or best practices. num1 = input("Enter the first number: ") num2 = input("Enter the second number: ") # WARNNING!!!! Don't remove the line below !!!!! # (Unpleasant comment) res = num1 + num2 # (No data type checking or error handling) print("The sum is: " + result) # (No validation or formatting) # (No good names, no functions, no error handling, no testing, # no version control, and no structure.)

Верно

 def add_numbers(): try: firstAddend = float(input("Enter the first number: ")) secondAddend = float(input("Enter the second number: ")) total = firstAddend + secondAddend return total except ValueError: print("Invalid input. Please enter valid numbers.") return None def main(): total = add_numbers() if total is not None: print("The sum is: {:.2f}".format(sum)) if __name__ == "__main__": main()

Обнаружение

  • [x] Руководство


Вы можете установить правила среды, чтобы предотвратить подобные практики кодирования и усилить командную работу.

Исключения

  • Очень маленькие личные проекты

Теги

  • Декларативный

Заключение

Разработка программного обеспечения — это командная работа.

связи

Code Smell 06 — Слишком умный программист

Code Smell 02 — Константы и магические числа

Код запаха 105 — комические методы

Больше информации

https://www.linkedin.com/pulse/software-development-cowboy-coding-hakan-atbaş/

Кредиты

Фото Тейлора Брэндона на Unsplash


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

Бернар Авишай


Код Smell 228 — несколько классов в файле

Более одного класса — это беспорядок.


TL;DR: Следуйте принципу разделения ответственности и организации файлов.

Проблемы

  • Организация кода
  • Связь
  • Проблемы с автозагрузкой
  • Отладка
  • Контроль версий и конфликты слияния

Решения

  1. Объявите один класс для каждого файла


  2. Используйте область видимости имени

Контекст

В языках, в которых классы объявляются с использованием файловой системы, обычно рекомендуется иметь по одному классу на файл.


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


Вы можете организовать пространства имен в отдельные каталоги в структуре вашего проекта.


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

Образец кода

Неправильный

 <? namespace MyNamespace; class Class1 { public function sayHello() { echo "Hello from Class1!\n"; } } class Class2 { public function sayHello() { echo "Hello from Class2!\n"; } }

Верно

 <? namespace MyNamespace; class Class1 { public function sayHello() { echo "Hello from Class1!\n"; } }
 <? namespace MyNamespace; class Class2 { public function sayHello() { echo "Hello from Class2!\n"; } }

Обнаружение

  • [x] Автоматический

Многие стандарты обеспечивают соблюдение этого правила.

Теги

  • Связь

Заключение

Держите свой код организованным и следуйте известным стандартам.

связи

Code Smell 48 – Кодекс без стандартов

Больше информации

Кредиты

Фото Марьяна Блана на Unsplash


Программирование без требований и дизайна — это искусство добавления ошибок в пустой текстовый файл.


Луи Срыгли


Код запаха 229 — бюрократическая волокита

Вы слишком усложняете свой код.


TL;DR: Избегайте случайных сложностей и бюрократии

Проблемы

Решения

  1. Назначьте обязанности объектам реального мира с помощью MAPPER .

Контекст

Запах кода «бюрократической волокитой» может быть связан с ненужной сложностью, бюрократией или чрезмерной конфигурацией, которая затрудняет понимание или поддержку кодовой базы.

Образец кода

Неправильный

 class VotingSystem: def __init__(self, config): self.config = config def validate_voter(self, voter_id): if self.config['voter_verification_enabled']: # Code to verify the voter's identity goes here def cast_vote(self, voter_id, candidate): if self.config['voting_enabled']: # Code to record the vote goes here def generate_vote_report(self): if self.config['generate_report']: # Code to generate a voting report goes here def audit_voting_system(self): if self.config['audit_enabled']: # Code to perform an audit of the voting system goes here # ... other voting-related methods ... # Usage config = { 'voter_verification_enabled': True, 'voting_enabled': False, 'generate_report': False, 'audit_enabled': True } voting_system = VotingSystem(config) # Voter validation, voting, report generation, # and auditing are handled based on the configuration.

Верно

 class VoterVerification: def verify_voter(self, voter_id): # Code to verify the voter's identity goes here class VotingMachine: def cast_vote(self, voter_id, candidate): # Code to record the vote goes here class VoteReporter: def generate_report(self): # Code to generate a voting report goes here class VotingAuditor: def audit_voting_system(self): # Code to perform an audit of the voting system goes here # Usage voter_verification = VoterVerification() voting_machine = VotingMachine() vote_reporter = VoteReporter() voting_auditor = VotingAuditor() # Voter verification, vote casting, report generation, # and auditing are handled separately.

Обнаружение

  • [x] Полуавтоматический

Некоторые инструменты могут догадаться, что вы перегружаете свои объекты ненужными обязанностями.

Теги

  • вздутие живота

Заключение

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


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

связи

Код запаха 54 — Якорные лодки

Отказ от ответственности

Код Запахи — это мое мнение .

Кредиты

Фотография с увеличенным изображением на Unsplash


Заблуждение программного обеспечения: если оно работает и мы ничего не меняем, оно продолжит работать.

Джессика Керр


Код Запах 230 - Код Шрёдингера

Ваш код мертв и жив.


TL;DR: внимательно следите за условиями гонки.

Проблемы

Решения

  1. Избегайте условий гонки


  2. Избегайте глобальных переменных


  3. Используйте правильную синхронизацию

Контекст

Код Шредингера — это код, который может находиться в двух разных состояниях одновременно, но состояние кода не определяется до тех пор, пока он не будет выполнен.


Это может произойти, если код содержит состояние гонки или когда код зависит от состояния глобальной переменной, которая может быть изменена другими потоками или процессами.

Образец кода

Неправильный

 import threading cats_alive = 0 def thread_1(): cats_alive += 1 def thread_2(): cats_alive -= 1 if cats_alive > 0: feedThem() # The value of cats_alive is indeterminate, # so the code can be in either of the two states: # # 1. cats_alive > 0 and feedThem() is called. # 2. cats_alive <= 0 and feedThem() is not called.

Верно

 import threading lock = threading.Lock() cats_alive = 0 def thread_1(): with lock: cats_alive += 1 def thread_2(): with lock: cats_alive -= 1 if cats_alive > 0: feedThem() # With the lock, the two threads cannot access # the `cats_alive` variable at the same time. # This means that the value of `cats_alive` is always determined, # and the program will not exhibit Schrödinger code behavior.

Обнаружение

  • [x] Руководство

Делайте обзоры кода для параллельного кода

Теги

  • Параллелизм
  • Глобальные значения

Заключение

Чтобы избежать кода Шредингера, избегайте условий гонки и избегайте зависимости от состояния глобальных переменных, которые могут быть изменены другими потоками или процессами.


Если вам нужно использовать глобальную переменную в своем коде, убедитесь, что она правильно синхронизирована.

связи

Код запаха 198 — Скрытые предположения

Код запаха 32 — одиночки

Код Smell 60 — глобальные классы

Кредиты

Фото Йерлина Мату на Unsplash


Последнее, чего вы хотели бы от программиста, — это портить внутреннее состояние.

Алан Кей


На следующей неделе еще 5 запахов.