paint-brush
So finden Sie die stinkenden Teile Ihres Codes [Teil XLVI]von@mcsee
635 Lesungen
635 Lesungen

So finden Sie die stinkenden Teile Ihres Codes [Teil XLVI]

von Maximiliano Contieri10m2023/11/27
Read on Terminal Reader

Zu lang; Lesen

Cowboy-Programmierer befolgen keine Best Practices. Sie befolgen keine Teamvorschläge. Cowboy-Codierung gilt im Allgemeinen als unprofessioneller und riskanter Ansatz in der Softwareentwicklung, da sie zu Code führen kann, der schwer zu warten und fehleranfällig ist.
featured image - So finden Sie die stinkenden Teile Ihres Codes [Teil XLVI]
Maximiliano Contieri HackerNoon profile picture

Ihr Code stinkt, weil es wahrscheinlich viele Stellen gibt, an denen er bearbeitet oder verbessert werden könnte.


Die meisten dieser Gerüche sind nur Hinweise darauf, dass etwas nicht stimmt. Daher ist es nicht erforderlich, sie per se zu reparieren ... (Sie sollten sich jedoch darum kümmern.)

Vorherige Code-Gerüche

Alle bisherigen Code-Smells (Teil I – XLV) finden Sie hier .


Lass uns weitermachen...


Codegeruch 226 – Gemischte Prioritäten

Ein weiteres abgestürztes Raumschiff. Ein weiteres Softwareproblem


TL;DR: Entwerfen und testen Sie die Software. Es ist günstiger als die Hardware

Probleme

Lösungen

  1. Erstellen Sie genaue Simulationen
  2. Erstellen Sie fehlertolerante Software

Kontext

Luna-25 stürzte am 19. August 2023 auf die Mondoberfläche.


Vier Tage vor der sanften Landung der indischen Raumsonde Chandrayaan-3 auf dem Südpol des Mondes.


Eine forensische Analyse ergab, dass die Anweisungen einen gemeinsamen Bus nutzten und nicht richtig priorisiert waren.


Bei Raumfahrzeugen gibt es eine lange Geschichte von Softwarefehlern.

Beispielcode

Falsch

 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()

Rechts

 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()

Erkennung

  • [x] Handbuch

Das ist ein Designgeruch

Stichworte

  • Zuverlässigkeit

Abschluss

Erstellen Sie Softwarekomponenten und simulieren Sie reale und nicht reale Bedingungen

Beziehungen

Code Smell 198 – Versteckte Annahmen

Mehr Info

Haftungsausschluss

Code Smells sind meine Meinung .


Die Analytical Engine hat keinerlei Anspruch darauf, etwas hervorzubringen. Es kann alles tun, was wir ihm befehlen sollen ... Aber es wird wahrscheinlich einen indirekten und wechselseitigen Einfluss auf die Wissenschaft selbst ausüben.


Ada Lovelace

Tolle Zitate zum Thema Software-Engineering


Code Smell 227 – Cowboy-Codierung

Überlassen Sie Cowboys den Hollywood-Filmen.


TL;DR: Schreiben Sie Code als Teamprogrammierer

Probleme

  • Lesbarkeit
  • Unzuverlässiger Code
  • Probleme des Personalmanagements
  • Mangel an Koordination

Lösungen

  1. Schreiben Sie professionellen Code.


  2. Verwenden Sie deklarative, nicht kryptische Namen.

Kontext

Cowboy-Programmierer befolgen keine Best Practices.


Sie befolgen keine Teamvorschläge.


Cowboy-Codierung gilt im Allgemeinen als unprofessioneller und riskanter Ansatz in der Softwareentwicklung, da sie zu Code führen kann, der schwer zu warten und fehleranfällig ist.


Cowboy-Programmierer sind gute Leute; Sie können jedoch nicht in einer Gruppe arbeiten .

Beispielcode

Falsch

 # 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.)

Rechts

 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()

Erkennung

  • [x] Handbuch


Sie können Umgebungsregeln festlegen, um diese Codierungspraktiken zu verhindern und die Teambildung zu fördern.

Ausnahmen

  • Sehr kleine persönliche Projekte

Stichworte

  • Deklarativ

Abschluss

Softwareentwicklung ist Teamarbeit.

Beziehungen

Code Smell 06 – Zu kluger Programmierer

Code Smell 02 – Konstanten und magische Zahlen

Code Smell 105 – Comedian-Methoden

Mehr Info

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

Credits

Foto von Taylor Brandon auf Unsplash


Die Gefahr von Computern besteht nicht darin, dass sie irgendwann so schlau werden wie Männer, sondern darin, dass wir uns inzwischen darauf einigen, ihnen auf halbem Weg entgegenzukommen.

Bernard Avishai


Code Smell 228 – Mehrere Klassen pro Datei

Mehr als eine Klasse ist ein Chaos.


TL;DR: Befolgen Sie den Grundsatz der Interessenstrennung und die Dateiorganisation

Probleme

  • Code-Organisation
  • Kupplung
  • Probleme beim automatischen Laden
  • Debuggen
  • Versionskontrolle und Zusammenführungskonflikte

Lösungen

  1. Deklarieren Sie eine einzelne Klasse pro Datei


  2. Verwenden Sie den Namensbereich

Kontext

In Sprachen, die Klassen über ein Dateisystem deklarieren, gilt es im Allgemeinen als bewährte Vorgehensweise, eine Klasse pro Datei zu haben.


Dieser Ansatz trägt dazu bei, die Organisation und Wartbarkeit des Codes zu verbessern und potenzielle Probleme zu reduzieren.


Sie können Namespaces in separaten Verzeichnissen innerhalb Ihrer Projektstruktur organisieren.


Auf diese Weise können Sie eine logische und effiziente Codebasis beibehalten und gleichzeitig die Probleme vermeiden, die mit der Deklaration mehrerer Klassen in einer einzigen Datei verbunden sind.

Beispielcode

Falsch

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

Rechts

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

Erkennung

  • [x] Automatisch

Viele Standards setzen diese Regel durch

Stichworte

  • Kupplung

Abschluss

Halten Sie Ihren Code organisiert und befolgen Sie bekannte Standards.

Beziehungen

Code Smell 48 – Code ohne Standards

Mehr Info

Credits

Foto von Marjan Blan auf Unsplash


Ohne Anforderungen oder Design ist Programmieren die Kunst, einer leeren Textdatei Fehler hinzuzufügen.


Louis Srygley


Code Smell 229 – Bürokratie

Sie machen Ihren Code zu kompliziert.


TL;DR: Vermeiden Sie zufällige Komplexität und Bürokratie

Probleme

Lösungen

  1. Weisen Sie mithilfe des MAPPER die Verantwortlichkeiten realen Objekten zu.

Kontext

Ein Codegeruch nach „Bürokratie“ könnte auf unnötige Komplexität, Bürokratie oder übermäßige Konfiguration zurückzuführen sein, die das Verständnis oder die Wartung der Codebasis erschwert.

Beispielcode

Falsch

 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.

Rechts

 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.

Erkennung

  • [x] Halbautomatisch

Einige Tools können vermuten, dass Sie Ihre Objekte mit unnötigen Verantwortlichkeiten aufblähen.

Stichworte

  • Aufbläher

Abschluss

Der bürokratische Codegeruch ist offensichtlich, da Entwickler durch die komplexe Konfiguration navigieren müssen, um festzustellen, welche Funktionen aktiv sind.


Dies führt nicht nur zu unnötiger Komplexität, sondern erhöht auch die Wahrscheinlichkeit von Fehlkonfigurationen, die die Integrität Ihres Systems beeinträchtigen könnten.

Beziehungen

Code Smell 54 – Ankerboote

Haftungsausschluss

Code Smells sind meine Meinung .

Credits

Foto von der Explosion auf Unsplash


Ein Trugschluss der Software: Wenn es funktioniert und wir nichts ändern, wird es weiterhin funktionieren.

Jessica Kerr


Codegeruch 230 – Schrödinger-Code

Ihr Code ist tot und lebendig.


TL;DR: Achten Sie sorgfältig auf die Rennbedingungen

Probleme

Lösungen

  1. Vermeiden Sie Rennbedingungen


  2. Vermeiden Sie globale Variablen


  3. Verwenden Sie die richtige Synchronisierung

Kontext

Schrödinger-Code ist Code, der sich gleichzeitig in zwei verschiedenen Zuständen befinden kann, der Zustand des Codes wird jedoch erst bei seiner Ausführung bestimmt.


Dies kann passieren, wenn der Code eine Racebedingung enthält oder wenn der Code vom Status einer globalen Variablen abhängt, die von anderen Threads oder Prozessen geändert werden kann.

Beispielcode

Falsch

 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.

Rechts

 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.

Erkennung

  • [x] Handbuch

Führen Sie Codeüberprüfungen für gleichzeitigen Code durch

Stichworte

  • Parallelität
  • Globals

Abschluss

Um Schrödinger-Code zu vermeiden, vermeiden Sie Race Conditions und vermeiden Sie die Abhängigkeit vom Status globaler Variablen, die von anderen Threads oder Prozessen geändert werden können.


Wenn Sie in Ihrem Code eine globale Variable verwenden müssen, stellen Sie sicher, dass diese korrekt synchronisiert ist.

Beziehungen

Code Smell 198 – Versteckte Annahmen

Code Smell 32 – Singletons

Code Smell 60 – Globale Klassen

Credits

Foto von Yerlin Matu auf Unsplash


Das Letzte, was ein Programmierer tun sollte, ist, sich mit dem internen Zustand herumzuschlagen

Alan Kay


Nächste Woche 5 weitere Gerüche.