Merhabalar. Önceki yazılarımızda "clean code" mevzusundan çokça bahsettik. Peki clean code pratiklerini nasıl öğreneceğiz? Kodumuzun ne kadar clean olduğunu nereden bileceğiz? Her zaman yanımızda kodumuzu inceleyip yol gösterecek, tenkit edecek bir üstad bulabilecek miyiz? Bu yazımızda bu sorulara cevap arayacağız.
Statik Kod Analizi
Yazılan kodların, önceden belirlenmiş kalite kriterlerine uyup uymadığını kodları çalıştırmadan analiz etmek şeklinde tanımlayabiliriz.
Hatalı kodların bulunması,
Test edilmemiş kodların belirlenmesi,
Tekrar eden kod bloklarının tespit edilmesi,
Güvenlik açığına sebep olabilecek kodların yakalanması
Kötü kokan kodların raporlanması
bu analiz sonucu gerçekleşebilmektedir. Statik kod analizi, yazılım araçlarıyla otomatize edilebilmektedir. İnsanlar tarafından gözle yapılan analize kod gözden geçirme (code review, code inspection) denilmektedir. Statik kod analizi, kod gözden geçirmenin yerini tutmasa da, birçok hatanın daha kod gözden geçirmeye gitmeden bulunmasını ve düzeltilmesini sağlamaktadır.
SonarQube
Statik kod analiz araçlarından günümüzde en popülerlerinde SonarQube'den bahsedelim. Standart statik kod analizi raporlarının yanında;
20'den fazla programlama dilini analiz edebilmesi
Kendi kurallarınızı tanımlamaya izin vermesi
Sürekli entegrasyon araçlarıyla entegre çalışabilmesi
Tahmini teknik borç (technical debt) süresini raporlayabilmesi
gibi özellikleri sayesinde kaliteli yazılım geliştirme süreçlerinin vazgeçilmezi olmaya doğru gidiyor.
Bir Eğitimci Olarak SonarQube
SonarQube analiz raporları, raporlanan her hatada, çiğnenen kuralla ilgili detay bilgileri örnekleriyle birlikte sunmasından dolayı tecrübesiz yazılım geliştiriciler için birer eğitim materyali niteliği taşıyor.
Usta Bir Çift Göz
Ayrıca geliştiricinin kolayca gözünden kaçan kodsal hataları bulup gözünüze soktuğunda, kendisine duyduğunuz minnettarlığı dile dökmekte zorlanabiliyorsunuz. 7 / 24 gözü kodunuzda olan üstad bir yazılımcıyı her zaman yanınızda bulamayabilirsiniz. SonarQube sizde bu hissi uyandırabiliyor.
Sürekli Entegrasyonda Statik Kod Analizinin Yeri
Statik kod analizini sürekli entegrasyon sürecinin bir parçası haline getirerek projenizin kalitesine büyük katkı sağlayabilirsiniz. Her gün akşam üretilecek kod analiz raporlarıyla geliştiriciler yazdıkları koddaki hataları en kısa sürede farkedip düzeltme imkanı bulabilecekler. Yeterince çılgın geliştiriciler her committe statik kod analizi yaptırıp anlık olarak kodlarının kalitesini takip etmek isteyebilirler. Kod kalitesini sayısal metriklerle ölçülebilir hale getirdiğinden, süreç içerisinde kodun iyiye mi yoksa kötüye mi gittiğini tespit edebilirsiniz.
Sonuç olarak, evde geliştirdiğiniz hobi projelerden, dev kurumsal projelere kadar heryerde kullanabileceğiniz SonarQube ile projelerinizin daha az bug'lı, temiz geliştirilmesini sağlayabilir, her yeni hatada yeni birşeyler öğrenme imkanı bulabilirsiniz.
OCR (Optical Character Recognition - Optik Karakter Tanıma), bize grafiksel dosyalardaki yazıları yakalama imkanı veren teknolojidir. Örneğin, kameraya yakalanan kırmızı ışıkta geçen araçların plakaları bu teknoloji ile tespit edilebilmektedir. Bu yazımızda Raspberry Pi 3 cihazımıza tesseract-ocr programını kurarak, Python ile etkileşime geçip, örnek bir resim dosyasındaki plakayı okuyacağız.
Doğru kurulduğundan emin olmak için şu komutu çalıştırabiliriz. tesseract -v
Şimdi örnek bir plaka resmi indirip tesseract programını komut satırından deneyelim. Aşağıdaki dosyayı plaka.jpg olarak kaydedelim.
Komut satırından tesseract programını örnek dosyamızı parametre vererek çağıralım. Sonucu komut satırına basması için stdout parametresini ekleyelim.
tesseract plaka.jpg stdout
Aslında baştaki TR kısmını okumaması işimize gelse de işimizi şansa bırakmamalıyız. tesseract'a resimleri vermeden önce image processing tekniklerini kullanarak işlemden geçirip, okunması gereken yazıyı daha belirgin hale getirmemiz gerektiğini not olarak düşelim.
Şimdi de Python ile tesseract'a resim okutalım. Resim işlemleri için Pillow, tesseract ile etkileşime geçmek için pytesseract kütüphanesini kurmamız gerekmektedir.
"plaka.jpg" isimli dosyayı okuyup içerisindeki yazıyı ekrana basan aşağıdaki Python kodunu "simple_ocr_plaka.py" isimli bir dosyaya kaydedelim.
Kodu çalıştırıp çıktısına bakalım: python simple_ocr_plaka.py
Böylece, OCR teknolojisine temel bir giriş yapmış olduk. Gerçek hayat senaryolarında okunacak görüntü dosyaları bu kadar açık net ve basit olmayacaktır. Başarılı sonuç alabilmek için OpenCV kütüphanesi kullanarak, araçların plakaları tespit edilip, netlik ayarlamaları yapılmalı, görüntüdeki pürüzler giderilmelidir.
GeoJSON, çeşitli coğrafik şekilleri tanımlamaya yarayan JSON tabanlı bir standarttır. Standardı detaylı incelediğimizde, tanımlı şekiller arasında dairenin bulunmadığını görüyoruz. Peki, dairesel çizim ihtiyacını nasıl karşılayabiliriz?
Bu yazımızda, yeni geliştirdiğimiz ultimate-geojson java kütüphanesini kullanarak nasıl dairesel çizim elde edilebileceği konusu üzerinde duracağız.
Biraz Matematik
Bir düzlemde bir noktaya eşit uzaklıktaki sonsuz noktalar kümesine çember diyoruz. Bu çemberin içinde kalan alana da daire diyoruz. Sonsuz noktayı hesaplamak ve tutmak şu anki teknolojide pek mümkün olmadığından, çember üzerinde kabul edilebilir çoklukta nokta bularak mükemmel olmasa da dairesel çizimler elde etmek mümkün olmaktadır.
İhtiyacımız olan, merkez noktası olarak aldığımız bir koordinatın, belirli bir yarıçap mesafe uzaklıktaki noktasının koordinatını bulmak. Bunu 360 farklı açı için tekrarlarsak, bulduğumuz 360 nokta ile bir daire temsil eder hale gelebiliriz.
Dünya yüzeyi düz olmadığından alışılageldik trigonometrik hesaplamalar, merkez noktaya yarıçap kadar uzaklıktaki koordinatları bulmakta yetersiz kalmaktadır. Bunun için kütüphanemizde şuradaki dünyanın küreselliğini dikkate alan formülü kullandık.
Pasta Dilimini Nasıl Yapacağız?
Taramak istediğimiz açı aralığını belirledikten sonra, sadece o aralıkta kalan noktaları bularak, yay çizimini elde edebiliriz.
Show me the code!
ultimate-geojsonkütüphanesi kullanarak, hesaplamalara elinizi bulaştırmadan dairesel çizim elde edebilirsiniz.
Kötü kokuya burnumuz alışınca artık kokuyu farketmez oluruz. Kodlamada da durum farklı değil. Kötü kokan koda o kadar aşina olmuşuzdur ki, onun yanlış olduğunu bile fark edemeyebiliriz. Clean Code notlarımıza devam ediyoruz. İşte kötü kokan kodu farketmemize yarayacak bazı ipuçları:
Yorumlar
Yersiz Bilgilendirme:
Kodun değişiklik geçmişi, en son kimin değiştirdiği gibi bilgiler versiyon takip sistemlerinde tutulmalıdır. Bu bilgileri kodda tutmak gereksiz yorum kirliliğine neden olmaktadır.
Eskimiş yorum:
Kod değiştirildikçe taşıdığı anlam değişir ve buna bağlı olarak yorumların da güncellenmesi gerekebilmektedir. Mevcut yorum artık yeni kod için anlamsızdır. Yanlış eskimiş yorumlar derleme hatasına yol açmadığı için çoğu yazılımcı yorumları güncellemeyi ihmal eder.
Lüzumsuz Yorum:
Koddan apaçık şekilde anlaşılabilecek konuları yorum olarak eklememek gerekir. Yorumlar kodun söyleyemediği şeyleri söylemek için yazılmalıdır.
Yoruma alınmış kod bloğu:
Gereksiz kodları silmekten korkmayın. Tekrar yazabileceğinize güvenin. Aksi takdirde yoruma alınmış kod, birgün birinin işine yarayabileceği düşüncesiyle kimsenin silmeye cesaret edemeyeceği kirlilik olarak kaynak kodda bulunmaya devam eder.
Geliştirme Ortamı
Derlemenin birden fazla adımda gerçekleştirilebilmesi:
Projeyi derlemeden önce yaptığınız adımları gözünüzün önüne getirin. properties dosyasında bir düzenleme, kullanılan üçüncü parti kütüphanelerde ekleme/çıkarma yapma, xml, java dosyalarında değişiklik yapma... Derleme işlemini basit bir kaç adımda gerçekleştiremiyorsanız geliştirme ortamınızı elden geçirme ihtiyacı var demektir. Kaynak kodu çektikten sonra basit bir derleme komutuyla proje derlenebilmelidir.
Testleri koşmanın birden fazla adımda gerçekleştirilebilmesi:
Testler de basit bir "run" komutuyla çalıştırılabilmelidir. Testleri çalıştırmanın basit, hızlı ve kolay olması gerekir. Aksi takdirde geliştiriciler test yazmaya ve koşmaya soğuyabilirler.
Fonksiyonlar
Çok fazla argüman alan fonksiyon:
Hiç argüman almayan fonksiyon en iyisidir. Sırasıyla bir, iki ve üç argüman alan fonksiyonlar gelir. Üçten fazla argüman alan fonksiyonlar tercih edilmemeli, gerekli refactoring yapılarak, argüman sınıfları oluşturularak bu kötü koku giderilebilir.
Output argümanı kullanmak:
Fonksiyon argümanları genelde input olarak anlaşılır. Output argüman kullanmak okuyucuyu yanlış yönlendirebilir.
Flag argümanı kullanmak:
Boolean flag argüman alan fonksiyon kuvvetle muhtemel iki iş yapıyor demektir. Fonksiyonlar tek işten sorumlu olmalıdır.
Atıl fonksiyon barındırmak:
Hiç çağrılmamış, kullanılmayan fonksiyonlar silinmelidir. İhtiyaç duyulması halinde versiyon kontrol sistemindeki geçmişe bakarak tekrar yazılabilir.
Java'da mutlak değer metodunun negatif sayı dönebileceğini biliyor muydunuz?
Mesela random pozitif integer değer almaya çalışırken beklenmedik bir negatif sayı sistemi alt üst edebilir. Bu sorun sadece bir exception fırlatmakla kalmaz bazen milyon dolarlık zararlara da yol açabilir.
1- Satın almak için istenen ücret bir aylık mı, yıllık mı, veya süreli mi yoksa sınırsız kullanım için mi? - Sınırsız kullanım için tek bir defa ödeme yapıyorsunuz. Başka bir ödeme yapmadan, güncellemeleri de takip edebiliyorsunuz.
2- Telefonu değiştirdiğimde veya telefon bozulduğunda verilerimi de kaybetmiş olacak mıyım? - Hayır, uygulamada bulunan içe aktar/dışa aktar mekanizmasını kullanarak verilerinizi koruyabilirsiniz. Verileriniz güncellendikçe "Dışa Aktar" tuşu ile veritabanınızı dosyaya aktarın. Bu dosyayı güvenli bir yerde yedekleyin. Telefon değiştirdiğinizde ilgili klasöre bu dosyayı koyarak "İçe Aktar" tuşunu kullanarak verilerinize kavuşmuş olacaksınız. Hangi klasöre atmanız gerektiği "İçe Aktar" sayfasında yazıyor.
Telefonda böyle bir klasör yoksa oluşturun ve dosyayı içine atın.
3- Demo sürümde bulunan kayıt sınırı PRO sürümde de var mı? - Hayır, PRO sürümde sınırsız kayıt yapabilirsiniz.
4- Pro sürümüyle stok sayımı yapabilirmiyim? - Evet. Barkodunu okutup kaydettiğiniz ürünlerin stok sayısını "Stok Takibi" sayfasında yapabilirsiniz. Stok girişi/Stok çıkışı işlemleri ile stok sayısını güncelleyebilirsiniz. "Stok Raporu" sayfasında geçmişe dönük günlük-haftalık-aylık hareket dökümünü görebilirsiniz.
5- Uygulamayı nasıl satın alacağız?
- Google Hesabınızdaki ödeme yöntemlerini kullanarak Google Play'den uygulama ve dijital içerik satın alabilirsiniz. Bu ilk alışverişinizse ödeme yönteminiz Google Hesabınıza eklenir. Ödeme yöntemlerini nasıl ekleyeceğinizi ve değiştireceğinizi öğrenmek için ödeme yöntemlerini ekleme ve değiştirme sayfasına göz atın.
Hesabınıza aşağıdaki kredi/banka kartlarını ekleyebilirsiniz:
American Express
MasterCard
Visa
Discover (sadece ABD)
JCB (sadece Japonya ve ABD)
Visa Electron (sadece ABD dışında)
Elo kredi kartları (yalnızca Brezilya)
Google Play üzerinden kabul edilen kartların türü, bulunduğunuz konuma göre değişiklik gösterebilir.
Doğrudan Operatör Faturalandırması
Bazı mobil cihazlar ve hizmet planlarında, uygulama ve dijital içerik satın alma işlemlerinin ücretini operatör faturanız üzerinden ödeyebilirsiniz. Bir uygulama satın aldığınızda, 15 dakika sonra operatörünüzün faturasında bir ödeme görürsünüz.
Türkiye'de şu anda Türk Telekom(Avea), ve Turkcell ile bakiyenizden ödeme yapabiliyorsunuz.
Not: Doğrudan operatör faturalandırmasına kaydolduğunuzda telefonunuzda "DCB_Association" ifadesiyle başlayan bir SMS (kısa mesaj) görebilirsiniz. DCB_Association mesajı, Google Play hesabınız için doğrudan operatör faturalandırması kaydını tamamlamak üzere otomatik olarak oluşturulur ve gönderilir.
Desteklenmeyen Ödeme Türleri
Google Play'de aşağıdakiler kullanılamaz:
Banka havalesi
EFT
Western Union
Money Gram
Sanal Kredi Kartları (VCC)
Sağlık Tasarruf Hesabı (HSA)
Toplu taşıma kartları
Bloke tutar türündeki herhangi bir ödeme
Robert C. Martin'den Clean Code kitabı bizim yazılım sektöründe oldukça popüler. Yazılım geliştiricilere kodun sadece çalışmasının yetmeyeceğini, aynı zamanda anlaşılır, sürdürülebilir, test edilebilir, genişletilebilir vb. olması gerektiğini ve bunun hangi yöntemlerle yapılabileceğini örneklerle anlatan kitabı tüm meslektaşlarıma öneriyorum. Sunum haline getirdiğim kendimce çıkardığım notları şuradan indirebilirsiniz.
Sunum PDF dosyası indirilemiyorsa içerik aşağıdaki gibidir.
Temiz kodun özellikleri
Verimli Okunabilir Test edilebilir Sürdürülebilir Yalın
Tekrar (dublication) içermeyen Anlamlı isimlendirmeli
Amaç:
Kodu bulduğumuzdan
temiz bırakmamızı
sağlayacak duyarlılığı
kazanmak
İsimlendirme
İsimlendirme niyeti belli etmelidir. Yanlış bilgilendirmemelidir. Telaffuzu mümkün olmalıdır. Aranabilmelidir.
Kodlamadan kaçınılmalıdır.
Aynı konsepten bahsederken aynı isim kullanılmalıdır.
Aynı isim farklı konseptler için kullanılmamalıdır.
Zeki olmaya çalışılmamalı, sade herkesin anlayacağı isim kullanılmalıdır.
İsimlendirme
İsimleri değiştirmekten korkmamalı. Gerekli yerlerde
refactor yapılmalıdır.
Helper, Manager vb. genel isimler sınıfın herşeyi içeren
torbaya döndüğüne işaret ediyor olabilir.
Fonksiyonlar
Küçük olmalıdır. İdealde en fazla 20 satır olmalıdır.
Nested yapılar 2 seviyeden fazla olmamalıdır. If, else,
while gibi blokların içi metoda alınarak tek satıra
düşürülebilir.
Metod tek bir iş yapmalıdır. Tek sorumluluğu olmalıdır.
(Single Responsibility Principle)
Fonksiyonlar
Switch blokları doğası gereği n tane iş yaparlar.
Mümkün olduğunca kaçınmalıdır.
Polimorfizm kullanarak switch blokları refactor edilebilir.
(Abstract factory vb.)
Fonksiyonun ismi açıklayıcı olmalıdır. Yaptığı iş
anlaşılmalıdır.
Fonksiyonlar
Fonksiyonların argüman sayısı en aza indirgenmelidir.
Mümkünse sıfır, en kötü üç argüman almalıdır.
Argüman sayısı artıyorsa, argüman objesi oluşturmalı,
argümanlar bu sınıf ile geçirilmelidir.
Output argümanlar ekstra dikkat gerektireceğinden
mümkün olduğunca kaçınılmalıdır.
Fonksiyonlar
Boolean flag argüman alan fonksiyon büyük olasılıkla
birden fazla iş yapıyordur. Fonksiyon ayrılarak flag
argümanından kurtulunmalıdır.
Fonksiyonun yan etkisi olmamalıdır. Var ise, fonksiyon
isminde belirtilmelidir. (Unutmayın, fonksiyon bir iş
yapmalıydı)
Fonksiyonlar
Bir fonksiyon ya nesnenin durumunu değiştirmeli ya da
nesneyle alakalı bilgi dönmelidir. İkisini aynı anda
yapmamalıdır.
Örneğin; public boolean set(String attribute, String value);if (set("username", “unclebob"))...
Set metodu birden fazla iş yapıyor...
Fonksiyonlar
Fonksiyondan hata kodu dönmektense exception
fırlatmak tercih edilmelidir.
Try/Catch blokları fonksiyonlara dönüştürülmeli, blok
sadeleştirilmelidir.
Fonksiyonlar
Single-entry, single-exit kuralı uzun fonksiyonlar için
mantıklıydı. Metodlarımızı kısa tutacağımız için birden
fazla return, break kullanılabilir, hatta daha açıklayıcı bile
olabilir.
Yorumlar
Kötü koda açıklama yazmakla uğraşılmamalı, kodu
tekrar yazmalıdır.
Kod açıklamaya gerek kalmayacak kadar okunur ve
anlaşılır olmalıdır. Derdimizi kodla anlatmalıyız.
Yorumlar
Yorumun gerekli olduğu yerler de vardır.
Yasal zorunluluklar. Lisans bilgilerini içeren yorumlar.
Koddaki bir tasarımsal kararın arkasındaki neden yorum
olarak eklenebilir.
Yorumlar
Geliştiriciyi çalıştırılacak kodun sonuçlarına karşı
uyarmak gerektiğinde yorum kullanılabilir.
TODO yorumları unutulmamak şartıyla faydalıdır.
Javadoc yorumları dökümantasyon için faydalıdır.
Yorumlar
Kodu okuyarak anlayabileceğimiz şeyler için yorum
yazılmamalıdır. Gereksiz kalabalık yaparlar.
Yanlış bilgi içeren, yanlış yönlendiren yorumlar
tehlikelidir. Bir an önce kurtulunmalıdır.
Yoruma alınmış kod bırakılmamalıdır, silinmelidir. Siz
silmezseniz, birinin işine yarayacak düşüncesiyle kimse
silmeye cesaret edemez.
Formatlama
Kodun çalışır olması kadar okunabilir olması da
önemlidir.
Kod listesi okurken gazete okuyor hissi vermeli,
yukarıdan aşağıya genelden özele doğru bir yapı
oluşturulmalıdır.
Formatlama
Alakalı metodlar birbirine yakın yerleştirilmelidir.
Değişkenler kullanıldığı yere mümkün olan en yakın
yerde tanımlanmalıdır.
Yatay satır uzunluğu, sayfada sağa doğru scrola gerek
bırakmamalıdır.
Formatlama
Takımca formatlamanın nasıl olacağına karar vermeli ve
tüm geliştiriciler bu kurallara uymalıdır.
Hataları Yönetme
Hata kodu dönmektense Exception kullanılmalıdır.
Böylece çağıran kod hata kodu kontrol etmekten
kurtulur ve esas işi yapan kod, hata handling kodundan
ayrıldığı için daha temiz olur.
Hataları Yönetme
Unchecked exception tercih edilmelidir. Checked
exception fırlatan bir metodun catch’i 3 seviye
yukardaysa, exceptiondaki bir değişiklik tüm seviyelerin
değişmesine ve yeniden compile-deploy edilmesine
sebep olmaktadır.
Checked exception olmadan da sağlam yazılım
yapılabilir. Örneğin; C#, C++, Python ve Ruby dillerinde
Checked exception yoktur.
Hataları Yönetme
Exception içine hata ile alakalı içeriksel bilgiler de
konulmalıdır. Ne yapmaya çalışırken hata oluştuğu
bilgisi debug yaparken yardımcı olacaktır.
Hataları Yönetme
Duruma özel nesne ile çözülebilecek exceptional
case’ler, try/catch ile değil, bu nesne ile çözülmelidir.
(SPECIAL CASE PATTERN [FOWLER]
m_total += expenses.getTotal();
// Special Case obejesi
public class PerDiemMealExpenses implements MealExpenses {
public int getTotal() {
// return the per diem default }
}
Hataları Yönetme
Metodlardan null dönmek hatalara davetiye çıkarır. Null
dönmemeli, Exception fırlatmalı veya SPECIAL CASE
nesnesi kullanılmalıdır.
Metodlara null parametre geçirmek, null dönmekten
daha kötüdür. Null parametre geçirmekten sakınmalıdır.
Birim Testleri
TDD (Test Driven Development) pratiğinin üç temel yasası vardır. 1- Fail eden bir test yazmadan production kodu yazma
2- Fail etmeye yetecek kadardan fazla test yazmaya devam
etme.
3- Fail eden testi geçecek kadardan fazla production kod
yazma. Testi geçecek kadar geliştirmen yeterli.
Birim Testleri
Bu sayede fail edecek test yaz - kodu geliştir - fail
edecek test yaz şeklinde bir döngüye girilir.
Böylece production kodu testlerle beraber üretilir.
Birim Testleri
Test sınıfları da production kod kalitesinde temiz
tutulmalıdır. İkinci sınıf vatandaş muamelesi görmemelidir.
Testler temiz tutulmadığında sürdürülemez ve bir süre
sonra production kod testsiz kalma tehlikesiyle karşı
karşıya kalır.
Testsiz kalan production kodda değişiklik yapmaya
cesaret etmek zordur. Nerenin bozulduğu anlaşılamaz
Birim Testleri
Test metodlarındaki assert sayısı en aza indirgenmelidir.
Testler çalıştırıldığında fail eden bir assert yüzünde onun
altında kalan assertlerin sonuçları muamma olmaktadır.
One assert per method en idealidir.
Test metodu sadece bir konuyu test etmelidir. Birden
fazla durum için farklı test metodları yazılmalıdır.
F.I.R.S.T. kuralı Testler F.I.R.S.T. kuralına uymalıdır:
Fast: Testler hızlı çalışmalıdır. Yavaş çalışan testi kimse
çalıştırmak istemez, hatalar tespit edilemez.
Independent: Testler birbirinden bağımsız çalışabilmelidir.
F.I.R.S.T. kuralı Repeatable: Testler her ortamda tekrarlanabilmelidir.
Self-validating: Test sonucunu anlamak için fazla düşünmeye gerek
olmamalıdır. Test ya geçmeli ya fail etmelidir. Durumu anlamak için
çıktıları incelemek vs. gerekmemelidir.
Timely: Testler zamanında yazılmalıdır. Production kodla beraber
geliştirilmelidir.
Sınıflar
Yukarıdan aşağıya statik değişkenler (önce publicler
sonra private statikler), sonra instance değişkenleri
(public, private sırasında) daha sonra public metodlar ve
private metodlar gelmelidir.
Sınıfı okurken gazete okuyor hissi vermelidir.
Sınıflar
Sınıflar olabildiğince küçük olmalıdır. Sorumluluklar
olabildiğince küçük parçalara bölünmelidir.
Sınıfa isim vermekte zorlanıyorsanız, sınıfın olması
gerektiğinden büyük olduğu anlaşılabilir.
Single Responsibility Principle der ki, bir sınıfın değişmesi
için sadece bir neden olmalıdır.
Sınıflar
Sınıfın sorumluluğu arttıkça, değişime uğrama olasılığı o
kadar artmaktadır.
Sınıfın manipüle ettiği değişken sayısına bakarak bu
değişkenlerden yeni sınıflar üretilebilir mi diye
sorgulamalıdır.
Evvela stok nedir, stok yönetimi nedir, neden stok takibi kullanmalıyım sorularını cevaplandırmamız gerekir.
Stok, bir firmanın ortaya çıkabilecek ani ihtiyaçları karşılamak ve üretimin
kesintiye uğramadan sürdürülmesini sağlamak amacıyla her an el altında
bulundurduğu mamul mal, ham madde ve ara malları miktarıdır.
Stok yönetimi ise hammadde, yardımcı madde, yarı mamul ya da
mamullerin, en uygun maliyetle zamanında tedarik edilmesi ve/veya
bulundurulmasına yönelik faaliyetlerin bütünüdür.
Stok yönetiminde, talep tahminleri ve üretim planlama
verileri kullanılarak, stoklama yapılır. Sipariş maliyeti, elde tutma
maliyeti, elde bulundurmama maliyeti göz önünde bulundurularak emniyet
seviyesi ve sipariş verme noktaları belirlemek temel gerekliliklerdir.
Tanımlardan da anlaşılacağı üzere stok tutmak maliyetlidir. Elinizdeki sermayeyi malzemeye bağlıyorsunuzdur. Talebe göre az stok tutarsanız müşteri kaybedersiniz, müşteri kaybederseniz işletmenizin sürdürülebilirliği tehlikeye girer. Talebe göre aşırı stok tutarsanız malınızın kullanım ömrü bitene kadar satılmazsa malınızın elde kalma riski vardır. Malzemeye bağladığınız sermayeyi kaybetmiş olursunuz. Bu tarz zararlardan kaçınmak, kârınızı azamiye çıkarmak için akıllı stok yönetimi yapmalısınız.
Peki stok takibi nasıl yapılır? Öncelikle tüm ürünlerinizi kimliklendirmeniz gerekmektedir. Herbirine benzersiz bir ürün kodu vermelisiniz. Stok giriş-çıkış hareketlerinde, satışta ve toptancıdan tedarik etmek için sipariş verirken bu ürün kodu kullanılır. Marketten aldığımız neredeyse her üründe bir ürün kodu (veya numarası) bulunur. Stok işlemlerinin takibini kolaylaştırmak için yazılımlar kullanılır. Bunun için de ürün kodunun bilgisayar ortamına hızlıca aktarılması gerekmektedir. Ürün kodlarının elle klavye kullanarak girilmesi işi oldukça yavaşlatmaktadır. Bu noktada barkod/karekod sistemi yardımımıza koşuyor.
Makinelerin gözleri kameralardır. Makinelerin insanlar gibi yazıları okuyabilmeleri için değişik yöntemler vardır. Optik Karakter Tanımlama (Optical Character Recognition, OCR) bunlardan biridir. Bu yöntemle makineler, düz metinleri bilgisayar ortamına aktarırlar. Ancak metnin yazı fontu, boyutu ve temizliği yazının doğru okunmasına olumsuz etki edebilmektedir. Ticari işlemlerimizde hatayı en aza indirebilmek için makinelerin daha rahat algılayacağı anadillerine yani birler ve sıfırlara geri dönmemiz gerekmektedir.
Barkod, çubuk kod ya da çizgi im, verilerin makinelerin okuyabilmesi için çeşitli kodlama yöntemleriyle sunulmasıdır. Barkod, veriyi paralel çizgilerin genişlikleri (birler) ve boşlukları (sıfırlar) arasında saklar. Barkod, barkod okuyucu olarak da adlandırılan optik okuyucular ile okunabilir veya özel yazılımlarla görüntü içinden taranabilir.
Barkodda saklanamayacak miktarda metnin kodlanması ihtiyacı doğduğunda iki boyutlu barkod da diyebileceğimiz karekod (qr code) geliştirilmiştir. Karekodun çok çeşitli kullanım alanları vardır. Karekod çözümlenerek kod içeriği kullanıcıyı internet
adresine, e-posta adresine, telefon numarasına, iletişim bilgilerine,
SMS veya MMS'ye veya coğrafi konum bilgisine yönlendirebilir.
Konumuza dönersek, ürün numarasını temsil eden barkodlar veya karekodlar üretip ürünlerimizin üzerine yapıştırmak suretiyle ürünlerimizi kimliklendirmiş oluruz.
Peki bu barkodları hangi cihazla okuyacağız? Piyasada binlerce TL tutarında barkod okuyucuları, el terminali bulunmaktadır. Üstelik barkod okuyucu almakla iş bitmiyor. Stok takibi yapabilmeniz için bir veritabanına ve yazılıma ihtiyacınız var. Maliyet gittikçe artıyor. Peki yaptığınız işlem hacmi bu kadar maliyetli bir sistemi almaya değer mi? Her esnaf bu maliyeti karşılayamamaktadır. Halbuki herbirimizin cebinde bulunan telefonlarda çok iyi kameralar bulunmaktadır. Yükleyeceğiniz basit bir karekod / barkod okuyucu yazılım ile binlerce liralık tasarruf yapabilirsiniz.
Binlerce kişinin indirip kullandığı, PMobile Android Barkod & Karekod Sistemi işinizi fazlasıyla görecektir. Dahili veritabanı yönetimi, excel (XLS) dosyasıyla yedekleme, ürünlere resim ekleme, stok hareketleri raporu gibi olmazsa olmaz özellikleri neredeyse bedava fiyatına cebinize getiriyor. Lisans kodu, abonelik yok. Tek sefer ödeme ile sahip olabilirsiniz.
Ayrıca programı kendinize özgü kullanabilirsiniz. Örneğin, müşteri takibi, üye takibi otomasyonu vb.
Yazılım geliştirirken günlük olarak karşılaştığım ilginç durumlar ve kendime notlarımı burada sizin de istifadenize sunuyorum. Notlar kısa kısa ve anahtar kelime düzeyinde bilgi içermektedir. Daha derinine dalmak size kalmış.
Apache Tomcat'te url'den gelen parametrelerin türkçe karakter sorununu Connector'a URIEncodin="UTF-8" property'sini ekleyerek çözebilirsin.
Hibernate query'de pagination (sayfalama) query.setFirst ve query.setMax ile yapılabilir.
Spring <form: radiobutoonlarda'da path aynı olmalı. <input radiobuttonlarda id aynı olmalı.
addScalar ile kolon döndürebilirsin. setEntity ile nesne döndürebilirsin. addScalar ile setEntity arasındaki farkı iyi bilmek gerek. (Hibernate)
ionic hybrid cross platform mobil uygulama geliştirirken apk imzalama komutu:
git repository listeleme git ls-tree --full-tree -r HEAD veya git ls-files
git repositorye gönderme git push origin master
<c:out />'un önemi: c:out escapes HTML characters so that you can avoid cross-site scripting.
if person.name = <script>alert("Yo")</script>
the script will be executed in the second case, but not when using c:out
Google Chrome tarayıcıda adres satırına chrome://inspect yazarak bilgisayarınıza bağlı android cihazınızda debug loglarını görebilirsiniz. Özellikle Ionic uygulamayı cihazda denerken loglar bu şekilde görüntülenebilir.
Asla <form:form kullanma. Bazı durumlarda Controller'a geldiğinde direk db'ye yazmış olarak geliyor.
PostgreSql anlık olarak bağlı kullanıcı sayısını döndüren sql sorgu select count(*) from pg_stat_activity where pid <> pg_backend_pid() and usename = current_user;
Spring MVC'de hata handle etme için bakınız: @ControllerAdvice ve @ExceptionHandle
Webde asenkron kod çalıştırmak istiyorsan bir spring managed bean'da @Async anotasyonlu metodun içine kodu yaz. Metodu normal şekilde çağır.
SecurityContextHolder.getContext().getAuthentication().isAuthenticated() anonim kullanıcıda da true dönüyor.