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 Kod Kokuyor
Önceki tüm kod kokularını (Bölüm I - XLV) burada bulabilirsiniz.
Devam edelim...
Code Smell 226 - Karışık Öncelikler
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
Sorunlar
- Bijeksiyon Arızası
- Beklenmeyen Kusurlar
Çözümler
- Doğru simülasyonlar oluşturun
- Hataya dayanıklı yazılım yapın
Bağlam
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.
Basit kod
Yanlış
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()
Sağ
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()
Tespit etme
- [x] Manuel
Bu bir tasarım kokusu
Etiketler
- Güvenilirlik
Çözüm
Yazılım bileşenleri oluşturun ve gerçek ve gerçek olmayan koşulları simüle edin
İlişkiler
Code Smell 198 - Gizli Varsayımlar
Daha fazla bilgi
Sorumluluk reddi beyanı
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
Code Smell 227 - Kovboy Kodlaması
Kovboyları Hollywood filmlerine bırakın.
TL;DR: Ekip programcısı olarak kod yazın
Sorunlar
- Okunabilirlik
- Güvenilmez kod
- İnsan Yönetimi Sorunları
- Koordinasyon eksikliği
Çözümler
Profesyonel kod yazın.
Bildirimsel, şifreli olmayan adlar kullanın.
Bağlam
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 .
Basit kod
Yanlış
# 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.)
Sağ
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()
Tespit etme
- [x] Manuel
Bu kodlama uygulamalarını önlemek ve ekip oluşturmayı zorunlu kılmak için çevre kuralları belirleyebilirsiniz.
İstisnalar
- Çok küçük kişisel projeler
Etiketler
- bildirimsel
Çözüm
Yazılım geliştirme ekip işidir.
İlişkiler
Code Smell 06 - Çok Zeki Programcı
Code Smell 02 - Sabitler ve Sihirli Sayılar
Code Smell 105 - Komedyen Yöntemleri
Daha fazla bilgi
https://www.linkedin.com/pulse/software-development-cowboy-coding-hakan-atbaş/
Kredi
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
Code Smell 228 - Dosya Başına Çoklu Sınıflar
Birden fazla sınıf karmaşadır.
TL;DR: Endişelerin ayrılması ilkesini ve dosya organizasyonunu takip edin
Sorunlar
- Kod Organizasyonu
- Kaplin
- Otomatik yükleme sorunları
- Hata ayıklama
- Sürüm kontrolü ve birleştirme çakışmaları
Çözümler
Dosya başına tek bir sınıf bildirin
Ad kapsamını kullan
Bağlam
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.
Basit kod
Yanlış
<? namespace MyNamespace; class Class1 { public function sayHello() { echo "Hello from Class1!\n"; } } class Class2 { public function sayHello() { echo "Hello from Class2!\n"; } }
Sağ
<? namespace MyNamespace; class Class1 { public function sayHello() { echo "Hello from Class1!\n"; } }
<? namespace MyNamespace; class Class2 { public function sayHello() { echo "Hello from Class2!\n"; } }
Tespit etme
- [x] Otomatik
Birçok standart bu kuralı zorunlu kılar
Etiketler
- Kaplin
Çözüm
Kodunuzu düzenli tutun ve bilinen standartları takip edin.
İlişkiler
Code Smell 48 – Standartsız Kod
Daha fazla bilgi
Kredi
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
Code Smell 229 - Bürokrasi
Kodunuzu aşırı karmaşık hale getiriyorsunuz.
TL;DR: Kaza eseri karmaşıklıktan ve bürokrasiden kaçının
Sorunlar
- Kazara Karmaşıklık
- Okunabilirlik
- Bijeksiyon Arızası
Çözümler
- MAPPER'ı kullanarak sorumlulukları gerçek dünyadaki nesnelere atayın.
Bağlam
"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.
Basit kod
Yanlış
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.
Sağ
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.
Tespit etme
- [x] Yarı Otomatik
Bazı araçlar, nesnelerinizi gereksiz sorumluluklarla şişirdiğinizi tahmin edebilir.
Etiketler
- Şişkinlikler
Çözüm
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.
İlişkiler
Code Smell 54 - Demir Tekneler
Sorumluluk reddi beyanı
Kod Kokuları benim görüşüm .
Kredi
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
Code Smell 230 - Schrödinger Kodu
Kodunuz ölü ve canlı.
TL;DR: Yarış koşullarına dikkatlice bakın
Sorunlar
- En Az Sürpriz İhlali İlkesi
- Yarış koşulları
Çözümler
Yarış koşullarından kaçının
Küresel değişkenlerden kaçının
Doğru senkronizasyonu kullanın
Bağlam
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.
Basit kod
Yanlış
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.
Sağ
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.
Tespit etme
- [x] Manuel
Eşzamanlı kod üzerinde kod incelemeleri yapın
Etiketler
- Eşzamanlılık
- Küreseller
Çözüm
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.
İlişkiler
Code Smell 198 - Gizli Varsayımlar
Code Smell 60 - Küresel Sınıflar
Kredi
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.