Scala İle Design Pattern Denemeleri 2

October 24, 2016

Scala gibi fonksiyonel bir dil ile kod yazmanın avantajlarından bir tanesi de OOP patternları fonksyionel versiyonları ile değiştirmeye itecek bir beyin jimnastiğini tetikliyor olması. Bir önceki yazımda tam fonksiyonel olmasada Observer patternini Scala’da kodlamıştım.

Şimdi ise Wrapper/Decorator patternini fonksiyonel bir şekilde kodlamaya çalışacağım.

Decorator Pattern

Bir nesneye dinamik ya da statik yollarla istediğimiz davranışı, özelliği vermemize yarayan bir design patternidir.

Örneğin bir email nesnemiz var ve gönderdiğimiz her emailin sonuna şirket imzası koymak istiyoruz, eğer email şirket dışı alıcıya gidiyorsa. Evet sana göz kırptım beyaz yakalı, 10000 karakterli türkçe ingilizce disclaimer bulunan emaillerin sahibi  :)

Oop ile kodlanması sanırım kabaca böyle olur. Gördüğünüz üzere Email interfaceinden türetilmiş bir concrete bir Email sınıfımız ve yine aynı interfaceden türetilmiş Decorator nesnemiz bulunmakta. Bu decorator nesnesini kullanarak ilgili özelliği Email nesnesine sağlamış oluyoruz.

trait Email {

  def body: String

}

case class EmailImpl(body: String) extends Email


abstract class EmailDecorator extends Email {

  protected val email: Email
}

case class ExternalEmailDecorator(protected override val email: Email) extends EmailDecorator {

  override def body: String = email.body + disclaimer

  private val disclaimer: String =
    """
      |************************************************************************
      |The information contained in this message or any of its attachments may be confidential and is intended for the exclusive use of the addressee(s).
      |Any disclosure, reproduction, distribution or other dissemination or use of this communication is strictly prohibited without the express permission of the sender.
      |The views expressed in this email are those of the individual and not necessarily those of BigBadAssCorp or BigBadAssCorp affiliated companies.
      |BigBadAssCorp email is for business use only.
      |This email and any response may be monitored by BigBadAssCorp to be in compliance with BigBadAssCorp's global policies and standards
    """.stripMargin

}


object EmailSender {

  def send(to: String, email: Email) = {

    if(!to.endsWith("@bigbadass.com")) {

      val decorator = ExternalEmailDecorator(email)
      send(to, decorator.body)
    }
  }

  def send(to: String, body: String): Unit = {
    //Send to email client
    println(s"$to -> $body")
  }
}

Fonksiyonel yaklaşım ise her zamanki gibi çok daha az satır kod ile ifade edilebiliyor. En önemli nokta burda emailMaker fonksiyonu. Bu fonksiyon parametresiz String dönen bir fonksiyonu parametre olarak alıyor ve kendisi parametre olarak Email alan ve tekrar Email dönen bir fonksiyon geri dönüyor. Bu işlemi yaparken de kendisine parametre olarak gelen fonksiyonu kullanarak ilgili Email nesnesine ilgili özelliği eklemiş oluyor.


...

def disclaimer(str: String): String = str +
    """
      |************************************************************************
      |The information contained in this message or any of its attachments may be confidential and is intended for the exclusive use of the addressee(s).
      |Any disclosure, reproduction, distribution or other dissemination or use of this communication is strictly prohibited without the express permission of the sender.
      |The views expressed in this email are those of the individual and not necessarily those of BigBadAssCorp or BigBadAssCorp affiliated companies.
      |BigBadAssCorp email is for business use only.
      |This email and any response may be monitored by BigBadAssCorp to be in compliance with BigBadAssCorp's global policies and standards
    """.stripMargin


  def emailMaker(func:String => String) = {
    (email: Email) => {
      new Email {
        override def body: String = func(email.body)
      }
    }
  }

  val disclaimerDecorator = emailMaker(disclaimer)

  def sendFunctional(to: String, email: Email) = {

    if(!to.endsWith("@bigbadass.com")) {

      val newEmail = disclaimerDecorator(email)
      send(to, newEmail.body)
    } else {
      send(to, email.body)
    }

  }

 ...

Postta paylaştığım kodların tamamına buradan ulaşabilirsiniz.

Bu noktaya kadar sıkılmadan okuduğunuz için teşekkür ediyorum, sorularınız olursa alttaki disqus kutucuğundan gönderin lütfen.

Scala İle Design Pattern Denemeleri 1

September 27, 2016

Bir süredir Scala ile alakalı blog yazma isteğim vardı. Nasıl giriş yapacağıma bir türlü karar verememiştim. Fakat bugün gördüğüm şu posttan sonra gerekli motivasyona sahibim artık :)

"Java enterprise implementation of observer pattern"

“Java enterprise implementation of observer pattern”

Bu post tabi Classic Programming Paintings tumblr hesabından geliyor, çok güzel paylaşımlar var şiddetle takip etmenizi öneriyorum ayrıca.

Çalıştığım projede bir kaç gün önce birebir aynı olmasa da observer patternina yakın bir çözüm üretmem gerekmişti.
Observer patterni isminden de anlaşılacağı gibi aslında belli sayıda gözlemcinin bir nesne üzerindeki değişikliklerden haberdar olmasını sağlayan bir oop patterni.

Problem

Belli başlı kaynak tutan classların/singleton objelerin düzgün bir şekilde kapatılması. Bu önemli bir konu çünkü bir çok noktada ilgili kaynakların leak olmasına sebep olup; uygulamaya beklenmedik hatalar verdirebilir.

Çözüm

Probleme brute force yaklaşıp ilgili yerde obj.close() şeklinde tabi ki çözebiliriz. Bu yaklaşımın en büyük sorunu kapatacağımız nesneleri önden bilmiyor oluşumuz. Yani kapatmak istediğimiz object singleton bir Object X olabileceği gibi ilgili katmanda var olmayan yani encapsulate edilmiş başka bir instance da olabilir. Ayrıca şu satırların gereksizlğini ve çirkinliği sizlere bırakıyorum :)

Object1.close
Object2.close
intance.close
socketWrapper.close
..

Observer Pattern

Observer patterni Subject vs Observer olmak üzere iki ayrı yapıdan meydana gelmektedir. Subject kendisi üzerinde olan herhangi bir durum değişikliğini yine kendisine üye olan observerlara; bu gözlemcilerin bir metodunu çağırarak bildirir. Gördüğünüz gibi oldukça basit generic bir yaklaşım.

Bizim proje için oluşturduğumuz örnek Subject ve Observer yapıları şu şekilde gözükmekte;

trait Observer {

  def observe
}

trait Subject[T <: Observer] {

  protected val observers: mutable.ListBuffer[T] = new mutable.ListBuffer[T]

  def addObserver(o: T): Unit = {
    observers += o
    return
  }

  def removeObserver(o: T): Unit = {
    observers -= o
    return
  }

  def notifyObservers = observers.foreach(_.observe)
} 

Bu traitleri extend ederek istediğiniz her tip eventi tetikleyip observerları haberdar edebilirsiniz.
Bizim probleme tekrar dönersek, closable observerları close eventi için haberdar etmek istiyorum. Bunu gerçekleştirmek için yapmamız gereken tek şey bu iki traiti extend etmek;

trait CloseableObserver extends Observer with Closeable {

  override def observe: Unit = close()

}

object CloseableSubject extends Subject[CloseableObserver]

Gördüğünüz gibi artık CloseableSubject aracılığı ile yeni closeable observerlar eklemek oldukça basit. Ayrıca CloseableObserver java.io.Closeable‘i extend ettiği compile time da ilgili clientları close metodunu implement etmeye zorluyoruz. Bu şekilde CloseableSubject notifyAll yaptığında tüm observerların close methodu çağrılmış olacak.

Evet tüm parçalar artık hazır olduğuna göre nasıl kullanacağımızı görebiliriz;

object KafkaAction
  extends ActionRunner
    with ActionRegister
    with CloseableObserver
    with LazyLogging {
    
    ...
    ...
    
   override def close: Unit = {
      logger.info("Object is closing resources")
      resource.close
      resource2.close
  }
}


//CloseableObserver'i extend etmiş herhangi bir class'in instance'i kendisini gözlemci olarak kaydedebilir
//Diğer nesneler için ise derleyici type hatası verecektir  
CloseableSubject.addObserver(actionRunner.asInstanceOf[CloseableObserver])

Evet artık observerlar kendilerini register ettiler dolayısı ile istediğimiz anda tüm gözlemcileri close eventi ile alakalı haberdar edebiliriz.

sys addShutdownHook {
  logger.info("Shutdown request initiated")

   CloseableSubject.notifyObservers     
}

Evet observer patterni basit hali ile bu şekilde. Siz kendi probleminize göre daha farklı subject yapıları oluşturabilirsiniz. Bu şekilde sadece eventi değil, değişen state’i de bildirebilirsiniz gözlemcilere.
Observer patterni ile alakalı daha detaylı bilgi için wiki sayfasına bakabilirsiniz ayrıca.

Bu noktaya kadar sıkılmadan okuduğunuz için teşekkür ediyorum, sorularınız olursa alttaki disqus kutucuğundan gönderin lütfen.

Neler oluyor?

June 19, 2016

Surekli yapmak istedigim ama bir turlu bir duzene oturtamadigim blog yazma isine insallah bu yazimla birlikte tekrar baslamayi hedefliyorum.

Biraz gec olsada 2016 ozetinden ve yilin geriye kalan yarisindan beklentilerimden bahsedecegim.

Bu sene hayatimda radikal kararlar verdigim ve hayata gecirdigim bir yil oldu, yeni yeni hayatimdaki belirsizlik dagilmaya ve gelecege dair hedeflerim netlesmeye basladi. Uzunca bir sure is/kariyer konusunda kararsizliklarim vardi. Bu kararsizlik oyle derindi ki nasil bir firmada calismak istedigimden tutun da, kullanmak istedigim programlama diline, yurtdisina cikip cikmamaya kadar belirsizlikler ile doluydu.
Dolayisi ile bu beni gerek yurtdisindan gerekse de yurticinden bir cok firmayla gorustugum amacsiz ilginc bir surece itti.

Bazi istatistikler paylasacagim bununla alakali, belki benzer surecte olanlara yardimci olur. Aslinda bu konu hakkinda daha detayli yazmayi hedefliyorum ama simdilik sayilar dursun burda.

Yurticinden yaklasik 12 firma ile gorustum, bazilari sektorun onde gelen firmalariydi bazilari ise orta olcekli firmalardi. 7′sinden teklif aldim, 3 tanesi ilk gorusmede karsilikli tatminsizlik ile sonuclandi. Diger ikisinin sorunlari neydi bilmiyorum, geri donmediler :)

Yurtdisindan ise 18 firma ile gorustum, yine cok bilinen 6 firmayla birlikte, orta olcekli sirketlerden ve startuplardan olusuyor gerisi. Ulke olarak Hollanda, Almanya, Ingiltere, Kanada, Singapur, Japonya, Cin, Thailand, Guney Afrika’dan olusuyor. Bu firmalardan 6′sindan teklif aldim, 5′ini sureci devam ettir(e)meyip biraktim, geriye kalanlari ise genelde 2. ya da son gorusmede olumsuz donduler.

%36 bir basari orani var fena degil gibi :)

Asil odaklanmak istedigim konu ise burda; kafamin ne denli karisik oldugunu gostermesi acisindan bu rakamlar ve cesitlilik onemli cunku bu surec cok yorucu ve firsat maliyeti var. Sabah 4′te yapilan deniz asiri is gorusmeleri, ortalama 3-4 gun suren proje assigmentlari, online testler zor isler vesselam. Inanmiyorsaniz kardesim Ahmete sorun gece 5′te cocugu az uyandirmadim yok oop yok functional programming, yok avl trees, ustte gomlek altta sort :D

Surecin bir kisminda bu sorunu nihayet farkedip, bazi kararlar almam gerekti. Oncelikle programlama dilini sectim, gereksiz bullshit scripting/dinamik dilleri cikardim(no offense scripting gurus :) ), jvm uzerinde calisacagima karar verdim ve dil olarak onceligim Scala olacakti. Ulke olarak ise cogunlukla Singapur, asya ulkeleri veya Turkiye olacakti. Bu kararlar surecleri hizlandirdi ve acikcasi baya rahatlatti. En nihayetinde kendimi Bangkokta, Priceline grubuna(Booking, Kayak, Agoda, Opentable) ait sirketlerden biri olan Agoda’da senior software engineer olarak ise baslarken buldum :)

Isin kariyer kisminin yaninda bazilarinizin bildigi bir cogunuzun haberinin olmadigi yeni bir projemiz var Sporapp ekibinden kardesim Bunyamin ile uzerinde calistigimiz. Tabi benim bu belirsizliklerim proje planlarimizi biraz bozdu ama en nihayetinde saglam adimlarla ilerliyoruz. 1 yili askin suredir uzerinde calisiyoruz umit ediyorum ki agustos-eylul donemi private alpha ile gorucuye cikariz, cok heyecanliyiz :)

Evet profesyonel hayatimda baya heyecanli projeler, yenilikler var lakin hayatin sadece isten ibaret olmadigini 3-4 yillik Sporapp surecinde tecrube ettigim icin biraz daha kendime ve diger hayallerime de yatirim yapmaya basladim. Bunlardan en oncusu tabi ki bir cogunuzunda sahip oldugu yeni yerler gormek, kulturleri tanimak. Aslinda yurtdisina cikisimin birincil motivasyonu bu durtu idi. Hayat bazi seyleri otelemek icin cok kisa. Dolayisi ile onumuzdeki gunlerde daha cok geziyor, goruyor ve paylasiyor olacagim, takibe devam :D

Tabi bunlarin hicbiri bedava degil malesef hayat birseyler vermenin karsiliginda sizlerden birseyler aliyor. Geride cok sevdigim kiz arkadisimi, kardesimi, ailemi ve dostlarimi biraktim. Bu surec boyunca yanimda olduklari icin ne kadar tesekkur etsem azdir, iyi ki varsiniz (buraya iki eliyle kalp isareti yapan ergen kiz resmi gelecek)

Facebook Marketing – Black Hole

August 7, 2014

As a new established startup’s owner, I’m really sick of Facebook news feed algorithm and pointless marketing promotion. As you all guys remember back in couple of years, Zuck promote proudly Like feature and importancy of getting fans for your company’s facebook page. So their motto was buy more Like, engage with your fans.

It makes sense they’re an internet company so they should make some money at some point. It’s totally fair, good for them.  So we believed them, like they said we promoted our page. We build an amazing community around our business niche. We paid facebook, facebook gave us customers. Totally win-win scenario, kudos for all of us!

But things changed It wasn’t enough for a startup has billions of users. They should figure out new revenue streams and they did. A dirty one, cheap one; if you want to access your fans which they liked your page explicitly (at least theory; In Facebook we trust) you should promote your posts individually. It’s like we, page owners who paid earlier for our customers need to pay more, ouchh?

So we started to pay for our customers again which we need to access organically at first step. Their excuse was average facebook user has 1500 stories per day( see the mashable post ). Daa, you told them like all these crap. You get money from all this crap owners. You create this chaos for all of your users, now to fix it you want more money from all your customers.

It’s not even open how you get these likes or who see your post or not. There are some magic numbers we should believe.

I’m not alone about this; see this amazing work;

Facebook Fraud

Anyway because of all these reason, we believe you don’t give a shit about your customer. We stopped paying you, we have limited resource at least we should spend it on more decent platforms.

We relaxed at that point and was not arguing about our facebook page. But again you bite us, even we’re doing nothing specially, all same routine. Here our this month post reach graph;

Screenshot 2014-08-07 20.52.43

So I guess we should give up and left you alone like this guys did -> http://blog.eat24hours.com/breakup-letter-to-facebook-from-eat24/

Polyglot Zamanlar

October 23, 2013

“Hep aynı dilde mi yazılım geliştiriyorsunuz? Eğer öyleyse geride kalmaya başlamış olabilirsiniz. Eskiden bir yada bilemediniz maksimum iki programla dilini kullanan yazılımcılar yaygın iken, bugün programlama dillerinin bu kadar muhafazakar bir şekilde kullanılması lüks bir durum olabilir” diyor bir çok yurtdışı yazılım blogları.

Stackexchange networkünün kariyer ilanlarına bakarsanız zaten sizde bunun ne kadar doğru olduğunu görürsünüz.

Nedir peki polyglot? Sözlüğü açıp baktığımda bir çok dil bilen anlamına geldiğini söylüyor. Buradan programlama dünyası içinde ki anlamının da benzer olduğunu rahatlıkla anlayabilirsiniz.

Peki olay nerden geldi bu noktaya, neden böyle bir ihtiyaç var ki? Zamanında biz değilmiydik yine assembly ile herşeyi yazan, sonra onu biraz daha üst seviyeye taşıyıp C kullanan, object oriented’a geçip C++ ile her problemi çözen, yetmeyip Java ile baştan sona koca koca enterprise sistemler kuran. Bunca zaman tek bir dil tüm ihtiyaçlarımızı karşıyorken ne değişti? Teoride hala turing complete   bir programlama dili ile herhangi bir problemi çözebiliriz. Ama günümüz pratikleri malesef böyle değil. Çünkü internet, cloud, mobile, big data vb. derken koca bir evren yarattık biz programcılar. Şimdi bu koca evrende her problemi aynı alet ile çözmeye çalışmak çılgınlıktan başka birşey değil.

Düşünebiliyor musunuz bir web sitesini C++ ile yazmaya çalıştığınızı, yada paralelleştirebileceğiniz bir map-reduce uygulamasını imperative bir yaklaşım ile çözdüğünüzü. Bu örnekleri arttırabiliriz. Lakin ana fikri aktrabildiğimi düşünüyorum :)

Tabi ki tüm programlama dillerini öğrenip, üzerinde ciddi seviyeye kadar tecrübe kazanacak bir yazılımcı yoktur herhalde(varsa bildiğiniz yorum yazın lütfen :) ). Ama varolan opsiyonları bilmek bunların avantajlarını ve dezavantajlarını bilip, belirli bir noktaya kadar aşina olmak, tüm bunlarıda var olan yazılım geliştirme konseptlerinin üzerine oturtmak bir çok noktada ufuk açacaktır. Bu şekilde yeni teknolojiler ile başarılı projeler yapabilirsiniz, yada var olan kullandığınız eski teknolojide size yenilikçi yaklaşımlar kazandıracaktır.

Tüm bu yeni dünya bedava değil tabi ki bir çok programlama dilinden oluşan bu çözümler yanında bambaşka mevzuları getiriyor ilgilenilmesi gereken, mesela;

Özetle bu işlerle ilgilenen herkesin dikkatle izlemesi gereken,  sessiz sakin bir devrim yaşanıyor programlama dünyasında. Bakalım önümüzdeki yıllar ne gösterecek bu konuda bizlere :)

Konu hakkında ki yorumlarınızı, özellikle Türkiye’deki sektör bazında fikirlerinizi lütfen paylaşın.

 

Hello world!

October 22, 2013

Herkese merhaba, yazilim, girisimcilik, teknoloji vb. konularda birseyler karalamaya calisacagim. Bakalim.

function(callback){
    callback("Hello World");
}