İsimlendirme Standartları 2
| 28.08.2008 @ 03:58 |
195 kere okundu,
0 yorum yazildi. |
Açıklamalar
| Tanım: |
Açıklamalar yazılan kodun daha anlaşılabilir hale gelmesini saÄŸlayan metinlerdir. Amaç, her satıra bir açıklama yazmak deÄŸil, birbirinden mantıksal olarak ayrılan kümeleri belli etmek, istisnai kullanımların belirtilmesi ya da eksik yapılan kısımların ileride geri çalışması yapıldığında hatırlatılmasını saÄŸlamaktır.
Açıklama Türleri:
1. C# uygun olarak, her yöntemin başına yöntemi ve deÄŸiÅŸtirgeleri açıklayan yorumlar yazılmalıdır:
/// <summary>
/// remove the task hierarchy from the system. delete
/// all rows related to this taskHierarchyID.
/// </summary>
/// <param name="taskHierarchyID">
/// taskHierarchyID
/// </param>
/// <returns>true if the task hierarchy is removed,
/// false otherwise
</returns>
public bool RemoveTaskHierarchyFromSystem(int taskHierarchyID)
2. Kodunuzda mantıksal olarak ayrılan kümeler varsa eÄŸer, bunlar arasında bir satır boÅŸluk koyup, her kümenin başına bu kümede yapılan iÅŸi tanımlayan bir açıklama eklemek, kodunuzun okunabilirliÄŸini arttırır. AÅŸağıdaki örnekte, iki küme birbirlerinden bir satır boÅŸlukla ayrılıp, açıklanmıştır.
//add a new row to task hierarchy general information table
DataTable dtTaskHierarchyGeneralInformation = dsTaskHierarchy.Tables["TaskHierarchyGeneralInformation"];
dtTaskHierarchyGeneralInformation.Rows.Add(dtTaskHierarchyGeneralInformation.NewRow());
//add the default starting row to the taskhierarchytotask table
DataTable dtTaskHierarchyToTask = dsTaskHierarchy.Tables["TaskHierarchyToTask"];
DataRow newRow = dtTaskHierarchyToTask.NewRow();
newRow["FK_TaskHierarchyID"] = DUMMY_ID;
newRow["FK_TaskID"] = DUMMY_ID;
newRow["TaskDuration"] = 0;
newRow["TaskParentTaskID"] = DUMMY_ID;
newRow["IsStartupTask"] = true;
newRow["IsParentTask"] = true;
dtTaskHierarchyToTask.Rows.Add(newRow);
3. C#’ta “//” ve “/* */” olmak üzere iki tip açıklama vardır. İlki tek satırda açıklama yapmaya izin verirken, ikincisi birden fazla satırda açıklama yazmanıza izin verir. Dikkat edilmesi gereken, açıklamanızı bir satırı aşıyorsa her satır için “//” kullanmak yerine, iki açıklama satırını birleÅŸtirerek “/* açıklama */” içinde birleÅŸtirmek daha iyidir.
Örnek: // Açıklamam 2 satır sürüyor. Birinci satırı burdan baÅŸlıyor
// İkinci satır burdan devam ediyor
yerine
/*
*comment’im 2 satır sürüyor. Birinci satırı burdan baÅŸlıyor
*İkinci satır burdan devam ediyor
*/
kullanmak gerekir.
4. Visual Studio türü kaliteli IDE’ler ve düzenleyiciler standart C# açıklamalarına fazladan özellikler de eklemiÅŸtir. Mesela “//TODO:” ÅŸeklinde baÅŸlayan bir açıklama, Visual Studio’nun Tasks panosunda otomatik olarak gösterilir.
Örnek olarak; program içinde yeniden gözden geçirilmesi gereken bir kod parçasını belirtmek için, aÅŸağıdaki açıklamayı ekleyelim.
//TODO : Bu bölüm eksik. Task hierarchy'nin projelerle iliskilendirilmesinden sonra tamamlanabilir – uozturk » Not: bu açıklama tek satırda yazılmalıdır.
EÄŸer Visual Studio’nun View > Show Tasks > Comment menusunu seçerseniz, yazdığınız açıklamayı aÅŸağıdaki ÅŸekilde görebilirsiniz.

Geriye yönelik çalışmalarınızı bu ÅŸekilde kontrol etmek, yapmanız gerekenleri deÄŸiÅŸik dosya, kağıt... vb lerine yazarak kontrol etmekten çok daha kolaydır. Kağıt, dosya kaybedilebilir. Ama kod üzerine yazdığınız bu özel açıklamalar her zaman kalıcı ve hatırlatıcıdır. |
Kullanıcıdan Alınan Girdilerin Değerlendirilmesi
| Tanım: |
Kullanıcıdan alınan girdi doÄŸruluÄŸunun kontrol edilmesi, hem uygulamanın düzgün çalışmasını, hem de kötü niyetli saldırganların, uygulamanın güvenliÄŸini tehdit etmesini engeller. Özellikle aÄŸ uygulamaları masaüstü uygulamalarına göre, SQL Injection, Cross Site Scripting vb saldırılara karşı daha açıktır.
Ayrıntılı bilgi için:
1. http://www.sitepoint.com/article/sql-injection-attacks-safe,
2. http://www.cgisecurity.com/articles/xss-faq.shtml
Neyse ki, ASP.NET aÄŸ kontrolleri bir çok onaylamayı bizim için yapmaktadır. ASP, ve JSP programlamaya göre bize daha az görev düÅŸmektedir. Ancak QueryString ile gönderilen deÄŸiÅŸtirgeler için böyle bir kontrol bulunmamaktadır.
Mesela;
http://localhost/CustomTracker/administration/customerdetails.aspx?id=12
URL’si, 12 deÄŸerini taşıyan “id” adlı bir deÄŸiÅŸtirgeyi kullanıcadan almaktadır. Bu ID otomatik olarak list sayfasından gönderilebilse de kullanıcı isterse burdaki deÄŸeri deÄŸiÅŸtirebilir ve bu URL’yi tekrardan çalıştırabilir. Programcının yapması gereken
1. DeÄŸiÅŸtirgenin QueryString içinde olup olmadığını
2. EÄŸer QueryString içinde varsa istenilen biçimde olup olmadığını kontrol etmek.
Yukarıdaki örnekte ilk olarak “id” deÄŸiÅŸtirgesinin varlığını, ardından da bu “id”nin mutlak tamsayı olup olmadığını kontrol etmek gerekir. Bu kontrollerin ikincisi daha büyük önem taşımaktadır. İlkinde en azından bir deÄŸiÅŸtirge yokken, ikincisinin eksikliÄŸinde veritabanımız tehdit altındadır. Yukarıda adı geçen referansların okunması, tehditin boyutlarını anlamak açısından önemlidir. |
Gereksiz "Sınıf Örnekleri" Kullanımından Kaçınmak
| Tanım: |
Yaratılan her deÄŸiÅŸken, ya da sınıf örneÄŸi içinde bulunduÄŸu küme sonlanana kadar bellek içinde yer tutar. Buna o deÄŸiÅŸkenin etki alanı denir.
Mesela:
for(int i = 0;i < dtTemplateList.Rows.Count;i++)
{
int templateID = (int)dtTemplateList.Rows[i] ["TemplateIDSel"];
...
}
Yukarıdaki örnekte templateID'nin etki alanı "for döngüsü"nü kapatan "}" parantezdir. Bu parantez kapandıktan sonra templateID, yokedilmek üzere garbage collector’a teslim edilir.
if(multipleRows.Length > 1)
{
StringBuilder taskName = new StringBuilder();
...
}
örneÄŸinde ise taskName nesnesi "if" kümesi sonlanana kadar bellekte tutulur.
Bu örnekleri daha derinleÅŸtirmek mümkün, ama esas konumuza gelirsek hatalı sayılabilecek bir kullanım ise aÅŸağıda gibidir:
if (condition)
{
String value = (new Xxxxx()).GetSomething(param); »1
DataSet dsSomething= new DataSet();
(new Xxxxx().GetAnotherThing(param); »2
ddlAnyWebControl.DataSource =( new Xxxxx()).GetList();
»3 ....
}
Yukarıdaki örnekte, “Xxxxx” adlı classın aynı scope’a sahip 3 tane örneÄŸi yaratılmıştır. “if” kümesi bitene kadar bunlar bellekte yer kaplar.
Bunun yerine kod aÅŸaığdaki ÅŸekilde düzenlenerek,
if (condition)
{
Xxxxx classInstance = new Xxxxx();
String value = classInstance.GetSomething(param);
DataSet dsSomething= new DataSet();
classInstance.GetAnotherThing(param);
ddlAnyWebControl.DataSource = classInstance.GetList();
....
}
hem bellek yönetimine yardımcı olmak hem de kodun okunabilirliÄŸini kolaylaÅŸtırmak amacıyla ilgili instance tek bir deÄŸiÅŸkene atanabilir ve ilerideki kullanımlarda aynı örnek kullanılarak, yenilerinin yaratılması önlenmiÅŸ olur. |
|
 |
Yazan:
Mehmet Çatkın |
|
|
Yorum Yazabilmeniz İçin Giriş Yapmanız yada Üye Olmanız Gerekmektedir.
|
- Haberler
- Programlar
- Forumlar
|