Kodunuz kokuyor çünkü düzenlenebileceği veya iyileştirilebileceği birçok durum var.
Bu kokuların çoğu, yanlış olabilecek bir şeyin ipuçlarıdır. Dolayısıyla bunların kendiliğinden düzeltilmesi gerekmez… (Yine de araştırmalısınız.)
Önceki tüm kod kokularını (Bölüm I - XLV) burada bulabilirsiniz.
Devam edelim...
Bir uzay aracı daha düştü. Başka bir yazılım sorunu
TL;DR: Yazılımı tasarlayın ve test edin. Donanımdan daha ucuzdur
Luna-25, 19 Ağustos 2023'te Ay yüzeyine düştü.
Hindistan'ın Chandrayaan-3'ü Ay'ın güney kutbuna yumuşak inişinden 4 gün önce.
Adli analiz, talimatların bir veriyolunu paylaştığını ve doğru şekilde önceliklendirilmediğini ortaya çıkardı.
Uzay araçlarının uzun bir yazılım hatası geçmişi vardır.
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()
Bu bir tasarım kokusu
Yazılım bileşenleri oluşturun ve gerçek ve gerçek olmayan koşulları simüle edin
Code Smell 198 - Gizli Varsayımlar
Kod Kokuları benim görüşüm .
Analitik Motorun herhangi bir şeyin ortaya çıkması gibi bir iddiası yoktur. Nasıl yapılmasını emredeceğimizi bildiğimiz her şeyi yapabilir… Ancak bilimin kendisi üzerinde dolaylı ve karşılıklı bir etki yaratması muhtemeldir.
Ada Lovelace
Yazılım Mühendisliği Harika Sözler
Kovboyları Hollywood filmlerine bırakın.
TL;DR: Ekip programcısı olarak kod yazın
Profesyonel kod yazın.
Bildirimsel, şifreli olmayan adlar kullanın.
Kovboy kodlayıcılar en iyi uygulamaları takip etmez.
Takımın önerilerine uymuyorlar.
Kovboy kodlaması genellikle yazılım geliştirmede profesyonel olmayan ve riskli bir yaklaşım olarak kabul edilir çünkü bakımı zor ve hatalara açık kodlara yol açabilir.
Kovboy Programcıları iyi insanlardır; ancak grup halinde çalışamazlar .
# 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()
Bu kodlama uygulamalarını önlemek ve ekip oluşturmayı zorunlu kılmak için çevre kuralları belirleyebilirsiniz.
Yazılım geliştirme ekip işidir.
Code Smell 06 - Çok Zeki Programcı
Code Smell 02 - Sabitler ve Sihirli Sayılar
Code Smell 105 - Komedyen Yöntemleri
https://www.linkedin.com/pulse/software-development-cowboy-coding-hakan-atbaş/
Unsplash'ta Taylor Brandon'ın fotoğrafı
Bilgisayarlardan kaynaklanan tehlike, sonunda erkekler kadar akıllı olmaları değil, bizim onlarla yarı yolda buluşmayı kabul etmemizdir.
Bernard Avishai
Birden fazla sınıf karmaşadır.
TL;DR: Endişelerin ayrılması ilkesini ve dosya organizasyonunu takip edin
Dosya başına tek bir sınıf bildirin
Ad kapsamını kullan
Sınıfları bir dosya sistemi kullanarak bildiren dillerde, dosya başına bir sınıfa sahip olmak genellikle en iyi uygulama olarak kabul edilir.
Bu yaklaşım, kod organizasyonunun ve bakımının iyileştirilmesine yardımcı olur ve olası sorunları azaltır.
Ad alanlarını proje yapınızda ayrı dizinler halinde düzenleyebilirsiniz.
Bu şekilde, tek bir dosyada birden fazla sınıf bildirme sorunlarından kaçınırken mantıksal ve etkili bir kod tabanını koruyabilirsiniz.
<? 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"; } }
Birçok standart bu kuralı zorunlu kılar
Kodunuzu düzenli tutun ve bilinen standartları takip edin.
Code Smell 48 – Standartsız Kod
Unsplash'ta Marjan Blan'ın fotoğrafı
Gereksinimler veya tasarım olmadan programlama, boş bir metin dosyasına hata ekleme sanatıdır.
Louis Srygley
Kodunuzu aşırı karmaşık hale getiriyorsunuz.
TL;DR: Kaza eseri karmaşıklıktan ve bürokrasiden kaçının
"Bürokrasi" kod kokusu, gereksiz karmaşıklık, bürokrasi veya kod tabanının anlaşılmasını veya sürdürülmesini zorlaştıran aşırı yapılandırmayla ilgili olabilir.
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.
Bazı araçlar, nesnelerinizi gereksiz sorumluluklarla şişirdiğinizi tahmin edebilir.
Geliştiricilerin hangi özelliklerin etkin olduğunu belirlemek için karmaşık yapılandırmada gezinmesi gerektiğinden bürokratik kod kokusu belirgindir.
Bu yalnızca gereksiz karmaşıklığı artırmakla kalmaz, aynı zamanda sisteminizin bütünlüğünü etkileyebilecek yanlış yapılandırma olasılığını da artırır.
Code Smell 54 - Demir Tekneler
Kod Kokuları benim görüşüm .
Unsplash'taki patlamanın fotoğrafı
Bir Yazılım Yanılgısı: Eğer işe yararsa ve biz hiçbir şeyi değiştirmezsek, çalışmaya devam edecektir.
Jessica Kerr
Kodunuz ölü ve canlı.
TL;DR: Yarış koşullarına dikkatlice bakın
Yarış koşullarından kaçının
Küresel değişkenlerden kaçının
Doğru senkronizasyonu kullanın
Schrödinger kodu aynı anda iki farklı durumda olabilen koddur ancak kodun durumu çalıştırılana kadar belirlenmez.
Bu, kod bir yarış koşulu içerdiğinde veya kod, diğer iş parçacıkları veya işlemler tarafından değiştirilebilen genel bir değişkenin durumuna bağlı olduğunda meydana gelebilir.
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.
Eşzamanlı kod üzerinde kod incelemeleri yapın
Schrödinger kodundan kaçınmak için yarış koşullarından kaçının ve diğer iş parçacıkları veya işlemler tarafından değiştirilebilecek global değişkenlerin durumuna bağlı kalmaktan kaçının.
Kodunuzda global bir değişken kullanmanız gerekiyorsa bunun doğru şekilde senkronize edildiğinden emin olun.
Code Smell 198 - Gizli Varsayımlar
Code Smell 60 - Küresel Sınıflar
Yerlin Matu'nun Unsplash'taki fotoğrafı
Herhangi bir programcının yapmasını isteyeceğiniz son şey dahili durumla uğraşmak
Alan Kay
Gelecek hafta 5 koku daha.