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 - XXXI) burada bulabilirsiniz.
Devam edelim...
İlk programlama günümüzde if/else öğreniyoruz. Sonra diğerini unutuyoruz.
TL;DR: Açık olun. Else'le bile.
Eğer bir IF cümlesine erken dönersek, else kısmını atlayabiliriz.
Daha sonra IF'yi kaldırıyoruz ve polimorfizmi kullanıyoruz.
İşte o zaman gerçek vakaları kaçırıyoruz.
function carBrandImplicit(model) { if (model === 'A4') { return 'audi'; } return 'Mercedes-Benz'; }
function carBrandExplicit(model) { if (model === 'A4') { return 'audi'; } if (model === 'AMG') { return 'Mercedes-Benz'; } // Fail Fast throw new Exception('Model not found); }
Sözdizimi ağaçlarını kontrol edip ayrıştırabilir ve eksik kalanlar için uyarı verebiliriz.
Ayrıca bunları yeniden yazıp mutasyon testi de yapabiliriz.
Bu tür bir koku kamuoyunda pek çok tartışmayı ve nefreti beraberinde getirir.
Fikir alışverişinde bulunmalı ve her artıya ve eksiye değer vermeliyiz.
Code Smell 36 - Switch/case/else if/else/if ifadeleri
Örtülü Başka Kullanmayı Durdurun
Örtülü Başka Ne Zaman Kullanılır?
Sinir bozucu IF'lerden Sonsuza Kadar Nasıl Kurtuluruz
Unsplash'ta Elena Mozhvilo'nun fotoğrafı
Yazılım ekiplerindeki en büyük sorun, herkesin diğerlerinin ne yaptığını anladığından emin olmaktır.
Martin Fowler
Bugün cüzdanımda bir ödeme bekliyordum. Bakiye 0'dı. Panikledim.
TL;DR: Boş, 0 değil. Hata 0 değil. Yalnızca 0, 0'dır.
Güvenlik sorunları hakkında çok şey okudum.
Özellikle kripto konusunda.
Geçen hafta bir kripto hack konusu okudum.
Cüzdanım bakiye olarak 0'ı gösterdiğinde paniğe kapıldım.
Bu sadece bir UX kokusuydu.
Blockchain'e ulaşılamıyordu 💩
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable show 0 as the balance """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: return 0
""" Below code is automatically generated by code-davinci-002 on GTP3 Codex 1. check balance with blockchain 2. If blockchain is unreachable throw an error """ import requests import json def get_balance(address): url = "https://blockchain.info/q/addressbalance/" + address response = requests.get(url) if response.status_code == 200: return response.text else: raise BlockchainNotReachableError("Error reaching blockchain")
Bu bir tasarım kokusu.
Bir istisna veya dönüş kodu atıldığında ve 0 ile maskelendiğinde kalıpları bulabiliriz.
Daima En Az Şaşkınlık prensibini bir rehber olarak takip edin.
Code Smell 139 - Kullanıcı Arayüzünde İş Kodu
Code Smell 73 - Beklenen Durumlar İçin İstisnalar
Unsplash'ta Jasmin Sessler'in fotoğrafı
Kod Kokuları sadece benim görüşüm .
Null ile ilgili asıl eleştirim, programınızı kontrol etmeden hızlı mı çalıştıracağınızı yoksa kontrol ederek yavaş mı çalıştıracağınızı seçme zorunluluğunun tüm acısını gereksiz yere geri getirmesidir.
Tony Hoare (Geçersiz Mucit)
Yazılım Mühendisliği Harika Sözler
Bir değişkene değer atarsınız ve onu kullanırsınız ancak asla değiştirmezsiniz.
TL;DR: Değişkenlik konusunda açıklayıcı olun.
Yeniden Düzenleme 003 - Sabiti Çıkart
Yeniden Düzenleme 008 - Değişkenleri Sabite Dönüştür
Her zaman etki alanından öğreniyoruz.
Bazen bir değerin MAPPER ile değişebileceğini tahmin ederiz.
Daha sonra değişmeyeceğini öğreniyoruz.
Bu nedenle bunu sürekli hale getirmemiz gerekiyor.
Bu aynı zamanda Sihirli Sabitleri de önleyecektir.
<?php function configureUser() { $password = '123456'; // Setting a password on a variable is another vulnerability // And Code Smell $user = new User($password); // Notice Variable doesn't change }
<?php define("USER_PASSWORD", '123456') function configureUser() { $user = new User(USER_PASSWORD); } // or function configureUser() { $user = new User(userPassword()); } function userPassword() : string { return '123456'; } // Case is an oversimplification as usual
Birçok linter, değişkenin yalnızca bir ataması olup olmadığını kontrol eder.
Ayrıca mutasyon testi de gerçekleştirebilir ve testlerin bozulup bozulmadığını görmek için değişkeni değiştirmeye çalışabiliriz.
Değişken kapsamı netleştiğinde kendimize meydan okumalı ve yeniden düzenlemeli ve onun özellikleri ve değişebilirliği hakkında daha fazla şey öğrenmeliyiz.
Code Smell 116 - 'var' İle Bildirilen Değişkenler
Code Smell 127 - Değişken Sabitler
Code Smell 107 - Değişkenlerin Yeniden Kullanımı
Code Smell 02 - Sabitler ve Sihirli Sayılar
Kod Kokuları sadece benim görüşüm .
Unsplash'ta Noah Buscher'ın fotoğrafı
Çalışan karmaşık bir sistemin, çalışan basit bir sistemden evrimleştiği her zaman ortaya çıkar.
John Gall
Ciddi geliştirmeler birçok farklı kişi tarafından gerçekleştirilir. Anlaşmaya başlamalıyız.
TL;DR: Farklı büyük/küçük harf dönüşümlerini karıştırmayın
Bir vaka standardı seçin
Ona tutun
Farklı kişiler birlikte yazılım yaptıklarında kişisel ya da kültürel farklılıklar ortaya çıkabilir.
Bazıları camelCase 🐫'i, diğerleri yılan_case 🐍, MACRO_CASE🗣️ ve daha birçoklarını tercih ediyor.
Kod basit ve okunabilir olmalıdır.
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "UPDATED_AT": "2022-01-07T02:23:41.305Z", "created_at": "2019-01-07T02:23:41.305Z", "deleted at": "2022-01-07T02:23:41.305Z" }
{ "id": 2, "userId": 666, "accountNumber": "12345-12345-12345", "updatedAt": "2022-01-07T02:23:41.305Z", "createdAt": "2019-01-07T02:23:41.305Z", "deletedAt": "2022-01-07T02:23:41.305Z" // This doesn't mean THIS standard is the right one }
Çalışanlarımıza şirketimizin geniş isimlendirme standartlarını anlatabilir ve bunları uygulayabiliriz.
Kuruluşa yeni insanlar geldiğinde, otomatik bir test kibarca ondan kodu değiştirmesini istemelidir.
Kapsamımız dışındaki kodlarla etkileşime girmemiz gerektiğinde, bizim standartlarımızı değil, müşterinin standartlarını kullanmalıyız.
Standartlarla uğraşmak kolaydır.
Bunları uygulamamız gerekiyor.
Code Smell 48 – Standartsız Kod
Bir isim tam olarak nedir - Bölüm I Arayış
Kod Kokuları sadece benim görüşüm .
Unsplash'ta Wolfgang Hasselmann'ın fotoğrafı
Eğer çok fazla özel durumunuz varsa yanlış yapıyorsunuz demektir.
Craig Zerouni
Maxint, geçersiz bir kimlik için çok iyi bir sayıdır. Ona asla ulaşamayacağız.
TL;DR: Gerçek kimlikleri geçersiz olanlarla birleştirmeyin. Aslında: Kimliklerden kaçının.
Özel durumları özel nesnelerle modelleyin.
Geçerli etki alanı nesneleri ve uygulama bağlantısı oldukları için 9999, -1 ve 0'dan kaçının.
Boş Nesneyi Tanıtın
Bilgi işlemin ilk günlerinde veri türleri katıydı.
Sonra milyar dolarlık hatayı icat ettik.
Daha sonra büyüdük ve polimorfik özel değerlerle özel senaryolar modelledik.
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define INVALID_VALUE 999 int main(void) { int id = get_value(); if (id==INVALID_VALUE) { return EXIT_FAILURE; // id is a flag and also a valid domain value } return id; } int get_value() { // something bad happened return INVALID_VALUE; } // returns EXIT_FAILURE (1)
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" // No INVALID_VALUE defined int main(void) { int id; id = get_value(); if (!id) { return EXIT_FAILURE; // Sadly, C Programming Language has no exceptions } return id; } get_value() { // something bad happened return false; } // returns EXIT_FAILURE (1)
Kodda özel sabitleri ve özel değerleri kontrol edebiliriz.
Harici tanımlayıcılarla ilişki kurmak için sayıları kullanmalıyız.
Harici bir tanımlayıcı yoksa bu bir sayı değildir.
Code Smell 120 - Sıralı Kimlikler
Kod Kokuları sadece benim görüşüm .
Unsplash'ta Markus Spiske'nin fotoğrafı
Böcekler köşelerde gizlenir ve sınırlarda toplanır.
Boris Beizer
Yakında 5 kod kokusu daha geliyor…