İşlevsel programlama ve kesinlik temelli programlama (LINQ to XML)

Bu makale, işlevsel programlamayı daha geleneksel emredici (yordamsal) programlama ile karşılaştırır ve zıtlıkları ele alır.

İşlevsel programlama ile komut temelli programlama karşılaştırması

İşlevsel programlama paradigması, sorun çözmede saf işlevsel bir yaklaşımı desteklemek için açıkça oluşturulmuştur. İşlevsel programlama bildirim temelli programlamanın bir biçimidir. Buna karşılık, C#, Visual Basic, C++ ve Java gibi nesne odaklı programlama (OOP) dilleri de dahil olmak üzere çoğu temel dil, öncelikli olarak kesinlik temelli (yordamsal) programlamayı destekleyecek şekilde tasarlanmıştır.

Kesinlik temelli bir yaklaşımla, geliştirici bilgisayarın hedefe ulaşmak için atması gereken adımları belirten bir kod yazar. Bu bazen algoritmik programlama olarak adlandırılır. Buna karşılık, işlevsel bir yaklaşım sorunu yürütülecek bir dizi işlev olarak oluşturmayı içerir. Her işleve giriş ve her işlevin döndürdüğü girişleri dikkatle tanımlarsınız. Aşağıdaki tabloda, bu iki yaklaşım arasındaki genel farklardan bazıları açıklanmaktadır.

Karakteristik Buyurgan yaklaşım İşlevsel yaklaşım
Programcı konsantrasyonu Görevleri (algoritmalar) gerçekleştirme ve durum değişikliklerini izleme. Hangi bilgilerin istenmesi ve hangi dönüştürmelerin gerekli olduğu.
Durum değişiklikleri Önemli. Varolmayan.
Yürütme sırası Önemli. Düşük önem
Birincil akış denetimi Döngüler, koşullular ve işlev (yöntem) çağrıları. Özyineleme de dahil olmak üzere işlev çağrıları.
Birincil işleme birimi Yapıların veya sınıfların örnekleri. Birinci sınıf nesneler ve veri koleksiyonları olarak çalışır.

Çoğu dil belirli bir programlama paradigması destekleyecek şekilde tasarlanmış olsa da, birçok genel dil birden çok paradigması destekleyecek kadar esnektir. Örneğin, işlev işaretçileri içeren dillerin çoğu işlevsel programlamayı desteklemek için kullanılabilir. Ayrıca, C# ve Visual Basic, lambda ifadeleri ve tür çıkarımı dahil olmak üzere işlevsel programlamayı desteklemek için açık dil uzantıları içerir. LINQ teknolojisi bildirim temelli, işlevsel programlamanın bir biçimidir.

XSLT kullanarak işlevsel programlama

Birçok XSLT geliştiricisi saf işlevsel yaklaşım hakkında bilgi sahibidir. XSLT stil sayfası geliştirmenin en etkili yolu, her şablonu yalıtılmış, birleştirilebilir dönüştürme olarak ele almaktır. Yürütme sırası tamamen önemsizleştirilmiştir. XSLT yan etkilere izin vermez (yordam kodlarının çalıştırılması için kaçış mekanizmalarının işlevsel safsızlığa neden olan yan etkiler oluşturabilmesi dışında). Ancak XSLT etkili bir araç olsa da bazı özellikleri en uygun değildir. Örneğin, programlama yapılarını XML'de ifade etmek, kodun nispeten ayrıntılı olmasını ve bu nedenle bakımının zor olmasını sağlar. Ayrıca, akış denetimi için özyinelemeye olan yoğun güven, okunması zor bir koda neden olabilir. XSLT hakkında daha fazla bilgi için bkz . XSLT Dönüşümleri.

Ancak XSLT, XML'i bir şekilden diğerine dönüştürmek için saf işlevsel bir yaklaşım kullanmanın değerini kanıtlamıştır. LINQ to XML ile saf işlevsel programlama, XSLT'ye birçok açıdan benzerdir. Ancak, LINQ tarafından XML, C# ve Visual Basic'e sunulan programlama yapıları, XSLT'den daha okunabilir ve korunabilir saf işlevsel dönüşümler yazmanızı sağlar.

Saf işlevlerin avantajları

İşlevsel dönüşümleri saf işlevler olarak uygulamanın birincil nedeni, saf işlevlerin birleştirilebilir olmasıdır: yani, bağımsız ve durum bilgisizdir. Bu özellikler, aşağıdakiler de dahil olmak üzere bir dizi avantaj sağlar:

  • Artırılmış okunabilirlik ve sürdürülebilirlik. Bunun nedeni, her işlevin bağımsız değişkenlerine göre belirli bir görevi gerçekleştirmek üzere tasarlanmış olmasıdır. İşlev herhangi bir dış duruma dayanmaz.
  • Daha kolay yinelenebilir geliştirme. Kodun yeniden düzenlenmesi daha kolay olduğundan, tasarım değişikliklerinin uygulanması genellikle daha kolaydır. Örneğin, karmaşık bir dönüşüm yazdığınızı ve ardından bazı kodların dönüşümde birkaç kez yinelendiğini fark ettiğinizi varsayalım. Saf bir yöntemle yeniden düzenleme yaparsanız, yan etkiler konusunda endişelenmeden istediğiniz zaman saf yönteminizi çağırabilirsiniz.
  • Daha kolay test ve hata ayıklama. Saf işlevler yalıtılarak daha kolay test edilebildiğinden, normal değerler, geçerli kenar durumları ve geçersiz kenar durumları ile saf işlevi çağıran test kodu yazabilirsiniz.

Yukarıda açıklanan nedenlerden dolayı, işlevsel programlama mikro hizmetler mimari stiline çok uygundur.

OOP geliştiricileri için geçiş süreci

Geleneksel nesne odaklı programlamada (OOP), çoğu geliştirici kesinlik temelli/yordamsal stilde programlamaya alışkındır. Saf işlevsel bir stilde geliştirmeye geçmek için, düşüncelerinde ve gelişime yaklaşımlarında bir geçiş yapmaları gerekir.

OOP geliştiricileri sorunları çözmek için sınıf hiyerarşileri tasarlar, uygun kapsüllemelere odaklanır ve sınıf sözleşmeleri açısından düşünür. Nesne türlerinin davranışı ve durumu çok önemlidir ve bu endişeleri gidermek için sınıflar, arabirimler, devralma ve çok biçimlilik gibi dil özellikleri sağlanır.

Buna karşılık, işlevsel programlama, veri koleksiyonlarının saf işlevsel dönüşümlerinin değerlendirilmesinde bir alıştırma olarak hesaplama problemlerine yaklaşır. İşlevsel programlama durum ve değişebilir verileri önler ve bunun yerine işlevlerin uygulanmasını vurgular.

Neyse ki C# ve Visual Basic, hem kesinlik temelli hem de işlevsel programlama yaklaşımlarını desteklediğinden işlevsel programlamaya tam atlama gerektirmez. Bir geliştirici, belirli bir senaryo için en uygun yaklaşımı seçebilir. Aslında programlar genellikle her iki yaklaşımı da birleştirir.

Ayrıca bkz.