Github Daki Projem İçin Öneriler
-
Mürit ve Müridelerim,
1-2 ay önce yazdığım android den gönderilen API isteklerini şifrelemek adlı programımı github'a koydum.
Projeyi detaylı bir şekilde http://mhmdalmz.com/index.php/2017/06/24/android-php-veri-trafigini-sifreleme/ burada anlattım.
Github Link (Php): https://github.com/MhmdAlmz/SecurePhpRestAPI
Github Link (Android): https://github.com/MhmdAlmz/SecureAndroidRestAPI
Linkler buradadır. Önerileriniz benim için önemli şurayı veya şurayı düzeltebilirsin veya şu kodu şöyle yapsan daha iyi olur senin için gibi önerileriniz nelerdir ?
Atış serbest. Github'a projeyi koyarken bir hayli zorlandım projeyi sanırırm doğru bir şekilde ekleyebildim.
Mod: Konuları doğru kategorilere açmaya özen gösterelim.
-
Oy oy oy. 15 sene öncesi PHP yazımı.
1. Sınıf ismiyle dosya ismi aynı olsun ki autoloader kullanabilesin.
1,5. Klasör hiyerarşisini oluştur.
2. Autoloader kullan.
3. Design patternleri kullan.
4. Sınıf dışında fonksiyonun olmasın. Hangi sınıf kullanıyorsa onun elemanı olsun ya da genel bir kullanımı varsa ilgili sınıfın ya da util sınıfının statik elemanı olsun.
5. MB stringlerle düzgün çalışıyor mu? PHP ile ne zaman mb string uğraşsam sıkıntı yaşadım.
6. Sistemin benim sunucumda çalışıp çalışmayacağını denetleyen bir test yazsan iyi olur (şu eksik, şu php konfigurasyonunda kapalı...).
7. Proje adı, yaptığı iş ile uyumlu değil. RestAPI'yi görünce bayağı bi uyarlama sandım ben. Seninki sadece şifreleme yapan bir proksi. Ona göre isim versen çok daha güzel olurdu.
-
-> Githup link yazmışsın, github olarak değiştirmelisin.
-> Secret Key'i kod içine hardcoded yazmışsın ve onu github'a commitlemişsin. Pek doğru bir yöntem gibi görünmedi bana.
-> Proje, Class, Method, değişken... isimlendirmelerine daha fazla zaman ayır, isimlendirme çok önemli.
-> Kodda standardın yok gibi. Daha düzgün görünen kod yazmalısın. Linter kullan mesela. IDE'lerin neredeyse tamamında kod formatlayan araçlar var:
- PhpStorm -> https://www.jetbrains.com/help/phpstorm/reformatting-source-code.html
- Android Studio -> https://stackoverflow.com/a/16580200/637724
- Eclipse -> https://stackoverflow.com/a/15655127/637724
-> Java tarafında şu şekilde notasyon kullanma, git C# yazarken kullan ama Java'da kullanma :)
static String _URL; static String _SecretKey; public static String get_SecretKey() { return _SecretKey; } public static void set_SecretKey(String _SecretKey) { Options._SecretKey = _SecretKey; } public static String get_IVKey() { return _IVKey; }
-> Java'da package isimleri küçük harflerle yazılır, sendeki geleneğin dışında olmuş:
package com.example.mhmdalmz.SecureTheApi.Security;
-> APK dosyasını da commitlemişsin. .gitignore dosyasını daha efektif kullanmalısın.
-> Madem ki unit test yok, isimlendirmeler düzgün değil, comment de yok, bari JavaDoc yaz.
-> Hardcoded String kullanmaktan kaçın:
Toast.makeText(getApplicationContext(), "Please Check UserName or Password", Toast.LENGTH_SHORT).show();
->Bir de kullandığın dilin (Türkçe / İngilizce) yazıım kurallarına uymaya çalış.
-
@MhmdAlmz kardesim. PHP-PSR a bir goz at.
Burada PHP icin bir nevi standartlar vardir. Autoload ve v.s. buradan bakarak uygulayabilirsin.
Autoloader kullanirsan dependency manager ile istedigin package'i ekleyebilirsin projelerine.
Ayrica namespace kullan PHP de. Daha duzenli klasor hiyerarsin olur.
-
@YeniHarman ,
FİKİR : Sınıf ismiyle dosya ismi aynı olsun ki autoloader kullanabilesin.
AutoLoader nedir bilmiyorum.
FİKİR : Klasör hiyerarşisini oluştur.
Klasör hiyerarşisini php de genelde kendim elle veriyorum örneğin stok lar ile ilgili işlem yapacaksam
ajax/StokAjax/StokEkle.php şeklinde devam eden bir hiyerarşi yaparım genellikle.
FİKİR : Autoloader kullan.
Autoloader nedir bilmiyorum.
FİKİR : Design patternleri kullan.
Design patternde genellikler AhmetTopuTut şeklindedir static olan değişkenlerime _ koyarım Interface de varsa I ile başlarım başka bir özelliği yok . Yani uzun zamandır yazdığım kod stilim bu şekildedir. Kendi Stillerinize örnek verir misn abi ?
FİKİR : Sınıf dışında fonksiyonun olmasın. Hangi sınıf kullanıyorsa onun elemanı olsun ya da genel bir kullanımı varsa ilgili sınıfın ya da util sınıfının statik elemanı olsun.
Örnek bi kod alabilir miyim anlamadım :(
FİKİR : MB stringlerle düzgün çalışıyor mu? PHP ile ne zaman mb string uğraşsam sıkıntı yaşadım.
Abi sadece rusçanınkini denedim sanırım o da çalışıyordu fakat küçük birşey denedim Спасибо , Добрый день. bunlar calısıyordu bir test ederim abi.
FİKİR : Sistemin benim sunucumda çalışıp çalışmayacağını denetleyen bir test yazsan iyi olur (şu eksik, şu php konfigurasyonunda kapalı...).
Bunun için Maven'in nasıl yapıldığını android'e projeyi nasıl compile ettirebleceğimi pek bilmiyorum github kullanmayı da yeni yeni öğreniyorum.
FİKİR : Proje adı, yaptığı iş ile uyumlu değil. RestAPI'yi görünce bayağı bi uyarlama sandım ben. Seninki sadece şifreleme yapan bir proksi. Ona göre isim versen çok daha güzel olurdu.
Geliştireceğim abi projede bir takım eksiklikler var benim de gördüğüm onları da zamanla güncelleyeceğim. Uyarlamadan kastın nedir abi biraz aydınlatır mısın :) (Ekleme çıkarma olarak)
Çok teşekkür ederim .
@JPriest ,
-> Githup link yazmışsın, github olarak değiştirmelisin.
Sorarlar likteki p yi hiç mi görmedin be adam diye :)
-> Secret Key'i kod içine hardcoded yazmışsın ve onu github'a commitlemişsin. Pek doğru bir yöntem gibi görünmedi bana.
Secret Key'i başka bir şekilde saklayamam ki abi ? Sanırım XML De saklı lan SecretKey den bahsediyorsun. Yada keylerin public olarak dışarıya erişime açık olması yani bunu kullanacak kişinin key'i değiştirmesi veya okuyabilmesinden bahsediyorsun tam anlamadım.
-> Proje, Class, Method, değişken... isimlendirmelerine daha fazla zaman ayır, isimlendirme çok önemli.
Genelde Türkçe yazdığımdan mecburen alıştım türkçe yazmaya çok fazla ingilizce kelime de bilmiyorum. Isimlendirmelerim de bu yüzden kötü olabilir. Şayet still den bahsediyorsan buna alıştığım için böyle yazmaya devam ediyorum . Kendi kod stilini atarsan inceleyebilirim ve çok sevinirim :)
->Kodda standardın yok gibi. Daha düzgün görünen kod yazmalısın. Linter kullan mesela. IDE'lerin neredeyse tamamında kod formatlayan araçlar var:
Design Patternlere göz atacağım gibi görünüyor :) Bunu YeniHarman, JPriest ve dhmm söylüyorsa vardır bi bildikleri :)
-> Java tarafında şu şekilde notasyon kullanma, git C# yazarken kullan ama Java'da kullanma :)
:((( Dikkat edeceğim abi peki nedeni nedir :)
-> Java'da package isimleri küçük harflerle yazılır, sendeki geleneğin dışında olmuş:
Bilmiyordum
-> APK dosyasını da commitlemişsin. .gitignore dosyasını daha efektif kullanmalısın.
Direk Allah ne verdiyse upload ettim Android studio hata verdiğinden tüm proje dosyalarını github içerisine attım Github desktop ile. Github da yeniyim bilmiyorum
-> Madem ki unit test yok, isimlendirmeler düzgün değil, comment de yok, bari JavaDoc yaz.
JavaDoc hiç aklıma gelmemişti :) Unit test ve bir çalışan android uygulaması ekleyeceğim çalışır bir sisteme entegre edip.
-> Hardcoded String kullanmaktan kaçın:
Projelerimin hepsinde XML dosyasındadır isimler vs. Yarın öbürgün türkçeleştirilirse veya japonlar kullanmak isterse dili rahatlıkla değiştirebilmek için. Bunda gerek duymadım sadece
->Bir de kullandığın dilin (Türkçe / İngilizce) yazıım kurallarına uymaya çalış.
UserName Benim değişken ismim hangi kafayla yazdıysam hiç dikkatimi çekmedi :) teşekkür ederim abi sanada herşey için.
@dhmm,
her dilin kendine has standartları mevcut sanırırm . Yazım şekli bakımından. Ek olarak özelden birkaç soru soracağım sana :)
-
MhmdAlmz bunu yazdı
FİKİR : Design patternleri kullan.
Design patternde genellikler AhmetTopuTut şeklindedir static olan değişkenlerime _ koyarım Interface de varsa I ile başlarım başka bir özelliği yok . Yani uzun zamandır yazdığım kod stilim bu şekildedir. Kendi Stillerinize örnek verir misn abi ?
yok design pattern o değil, kod stilin değil. programlamada bazı sık karşılaşılan senaryolar için geliştirilmiş yaygın ve genelleşmiş çözüm teknikleridir design patternler. repository pattern, singleton patter vs gibi tonla örneği var.
bir de anti-patternler vardır, bunlar da yine bazı senaryolar için ibret olabilecek kötü pratiklerdir.
-
Bence onerileri pull requestle yapalim 😀
-
@Lightsaber , hocam baktım da sanırım UML ve USE CASE diagramı kapsayan birşey bu . Kodun işlevini falan açıklamak için sanırım bunları da belirli standartlara uydurmuşlar . Doğru mu ?
repository pattern, singleton patter de araştırayım
@TeRRoR olabilir hocam :)
-
Kesin doğru ya da kesin yanlış kod olmadığı için bilindik design patternin kullanıp kullanılmaması gereği tartışılabilir fakat şöyle bir şey düşün:
Kodunda şifreleme yapan sınıfın sadece bir kopyasını kullanman lazım (her seferinde secret key ile ilklendirmemen için). Yani o sınıfın her zaman bir tane örneğinin yaşadığından emin olmalısın. O zaman singleton pattern'i kullanabilirsin. Singleton patternin gerekliliği konusundaki tartışmayı geçiyorum (madem bir tane lazımsa, sadece bir tane create et gibi).
Kodun doğru çalışması için Secret key'inin 50 karakter uzunluğunda olmasının zorunlu olduğunu düşünelim. Yani kurucu metod 50 karakter uzunluğunda bir katar almalı.
function __construct($SecretKey)
{
if (count($SecretKey) != 50)
{ ... // eee burada ne olacak?
...
O zaman şu çıkıyor? Exception mı fırlatmalıyım? Olabilir fakat benim ilk tercihim olmaz. Neden bilmiyorum. Belki C kökenli olduğumdan belki de exceptionların C++'ta sıkıntılı olduğunu bildiğimden. Exception handling bana göre değil:) Çok daha kolay olduğunu düşündüğüm yöntemler var.
Ayrı bir init() metodu mu yazmalıyım? Olabilir fakat benim yine tercih edeceğim bir şey değil. Neden ikinci bir metot çağrısına ihtiyaç duyuyorum ki? C++ ile kod yazsam tercihim bu olurdu ama.
Üçüncü şık olarak ben bunu bir statik sınıf metodu ile üretsem ve sınıfın kurucu fonksiyonuna her zaman gereken değerleri yollasam? Bence uygun bir çözüm. Oldu mu sana factory pattern.
Yine koduma dönüyorum. Bana işimi yapabilmem için rastgele sayılar gerekiyor. Rastgele sayı üreten birden fazla sınıf var fakat bunların bazıları PHP X sürümünde yok. Ben Y sınıfını direkt kodumda kullansam bu sefer X+1 sürümüne tek bir iş için gebe kalacağım. Bunun yerine A, B, C sınıflarını aynı interface'i (arayüzü) uyarlayacak şekilde genelleştiririm ve bu arayüzü sınıfımın kurucusuna parametre olarak alırım. Artık sınıfımın değişkenleri arasında o arayüzün referansı dışında bir şey tutmama da gerek kalmaz. Bu da etti mi sana dependecy injection.
Daha adını bilmediğim ama kullanmış olduğum (tamamen öylesine) patternler de var. Mesela Facade. Hatta mvc kodlar yazıp (öyle mvc fw deki gibi değil tabi ama yakın) sonradan mvcnin ne olduğunu öğrenmişliğim var.
%100 gerekli mi? Bence hayır. Kullanmalı mıyım? Kullansam iyi olur. Tabi iyi öğrendikten ve gerçekten işimi kolaylaştıracağına inandıktan sonra. Yoksa acele işe anti-patternler karışır. En basitinden hebele hübele yazdığım bir kodda gayet rahat god object (haşa, bu ismi kullanmayı sevmiyorum fakat araştırma yapılabilir diye verdim) oluşabiliyor. Bu en basit tanımıyla birden fazla işi yapan bir nesne oluşturmak anlamına geliyor. Bir fonksiyon birden fazla işi yapmaması gerektiği gibi bir nesne de mantıksal olarak birden fazla görevi gerçekleştirmemeli. Örneğin senin sınıf hem http requesti alıp hem işleyip hem de ekrana bastırmamalı.
Sözün özü, yukarıdaki işlemler çoğu zaman 100 satırda yapabileceğin işi 300-400 satıra da çıkarabilir. Mantık çerçevesinde buna karar vermen lazım. En önemlisi de koduna dökümantasyon ve açıklama yazmadığın zaman kodunu kullanacak yazılımcıdan sağlam küfürler yiyebileceğindir. Yani dökümantasyonsuz kod, en güzel kod olsun, bir işe yaramaz.
-
@YeniHarman , Açıklamalar için öncelikle çok teşekkür ediyorum zaten teşekkür ede ede bi hal olduk orası ayrı.
Söylediklerini Yazdım hafızamın en sağlam yerlerine. Bir sonraki projelerimi dediğin gibi yapmaya çalışacağım. Fakat PHP de daha hiç bir framework kullanmadım (codeigniter,laravel vs) Php de genelde REST API Yazıp yani gelen parametreye uygun sonuçlar üretmekdi benim işim o yüzden 10-15 yıl önceki PHP koduymuş gibi gözüküyor evet haklısın.
Patternler konusunda genel bir araştırma yaptım Şuradaki amcalar çok iyi anlatıyor olayı ki gayet mantıklı.
Bir bakıma haklısın , dışarıdan bu yazacağm bir kodu kullanacak bir yazılımcı kodun ne işe yaradığını veya kendi algoritmasını ilave edip edemeyeceğini belirlemesi için patternlere ihtiyaç var. Yani Kodun okunabilirliğinin arttırılmasına ve esnekliğinin arttırılmasına.
https://www.youtube.com/watch?v=vNHpsC5ng_E&list=PLF206E906175C7E07
Video burdadır burada bir çok pattern anlatılıyor sanırım 2-3 video izledim dedim bu ne :) Malesef Türkiyede Üniversitelerde Code Monkey yetişiyor biz her ne kadar YOOOO desek de :D Ya bizde sıkıntı var yada Akademik .
Çok çok çok çok teşekkür ederim.
-
Videodan bir şey öğrenme işine pek alışamadım. Aykut Taşdelen'in Android programlama kitabını aldım ve beğendim. Yazar c ve sistem programcıları derneği bünyesinde zaten. Aynı yazarın tasarım desenleri ve uml kitabını almayı düşünüyorum.