Coldfusion ve Recursive Fonskiyonlar

Tarih: July 1st, 2010 | Yazan: | 1 Yorum »

Uygulama geliştiren herkes bir yerde döngülerin yeterli olmadığını bilir. Bu durumda kendini kendi içinde tekrarlayacak fonksiyonlara  ihtiyaç duyarsınız. Bu tür fonksiyonlara recursive fonksiyonlar adı verilir.

Örneğin sitenizin içinde yer almasını istediğiniz aşağıdaki yapıyı (breadcrumb) veritabanı içindeki verilerden alıp oluşturmanız gerekiyor.

Anasayfa >Amerika Kıtası > Kuşlar > Yırtıcı Kuşlar > Kel Kartal

Ve verileriniz de veritabanında aşağkine benzer bir tabloda tutuluyor:

ID CONTENT PARENTID
1 Anasayfa 0
2 Amerika Kıtası 1
3 Kuşlar 2
4 Sürüngenler 2
5 Yırtıcı Kuşlar 3
6 Evcil Kuşlar 3
7 Asya Kıtası 1
8 Kel Kartal 5
9 Şahin 5

Bu durumda en altta bulunan satırdan anasayfaya kadar olan veriyi analiz edip birbiri ile ilgili olanları eklememiz gerekecek. Buradan örnek dosyayı indirebilirsiniz.

Bu işlem için iki fonkisyona ihtiyaç duyacağız:

Bunlardan birincisi bizim parametrelerimizi (bulunduğumuz içeriğin ID’si ve anasayfa’nın ID’si) göndereceğimiz fonksiyon. Bu fonksiyon asıl veriyi oluşturacak olan ikinci fonksiyonu çağaracak ve ona içini dolduracağı boş bir değişken gönderecek.

Fonksiyon 1: getParentStructure(ContentID,HomePageID)


<cffunction name="getParentStructure">
<cfargument name="contentID">
<cfargument name="homepageID">
<cfset ParentData="">
<cfset ParentData=ListChangeDelims(ParentData,"|")>
<cfset ParentDataOutput = getParent(ParentData,ContentID,HomePageID)>
<cfreturn ParentDataOutput>
</cffunction>

Fonksiyon 2: getParent(ParentData,ContentID,HomePageID)

İkinci fonksiyon ise birinciden gelen veriye göre kendini kendi içinde işlem tamamlanana kadar tekrarlayacak fonksiyon. Burada ikinci fonksiyonun recursive (kendi kendini çağıran) özelliğini 13. satırda görebilirsiniz. Şartlar sağlanana kadar bu fonksiyon kendini tekrar tekrar çağıracak. Örneği incelemek için çalışan dosyayı buradan indirebilirsiniz.


<cffunction name="getParent">
<cfargument name="ParentData">
<cfargument name="ContentID">
<cfargument name="HomePageID">
<cfquery name="qSiteTreeII" dbtype="query">
SELECT * FROM qSiteTree WHERE CONTENTID=#arguments.contentid#
ORDER BY PARENTID, ORDERME ASC
</cfquery>
<cfif arguments.ContentID NEQ arguments.HomePageID>
<cfset nextParent=qSiteTreeII.PARENTID>
<cfset breadCrumbItem="<li><a href='' >"&qSiteTreeII.MENUTITLE&"</a></li>">
<cfset breadCrumb=ListPrepend(ParentData,breadCrumbItem,"|")>
<cfreturn getParent (breadCrumb,nextParent,arguments.HomePageID)>
<cfelse>
<cfset breadCrumbItem=application.homePageItem>
<cfset breadCrumb=ListPrepend(ParentData,breadCrumbItem,"|")>
<cfset breadCrumb=Replace(breadCrumb,"|","","ALL")>
<cfreturn breadCrumb>
</cfif>
</cffunction>

1 Yorum - “Coldfusion ve Recursive Fonskiyonlar”

  1. 1 Mahmut saat 21:43 dedi. July 9th, 2010:

    Merhaba
    makale için çok teşekkürler elinize sağlık.


Bir yanıt yazın.