Posts

Showing posts from 2011

Kotlin Language Features Related to Null Handling

Any software engineer with a Java background would find the null handling features in the Kotlin language interesting. Let's summarize this topic with some examples. Nullable types: In Kotlin, types are non-nullable by default. If you want a variable to be able to hold a null value, you need to explicitly declare its type as nullable using the Type? syntax. For example, String? denotes a nullable string, while String represents a non-nullable string. Safe calls (?.): Kotlin introduces the safe call operator (?.) for handling nullable types. It allows you to safely invoke a method or access a property on a nullable object. If the object is null, the expression returns null instead of throwing a NullPointerException. Example: data class Person(val name: String, val age: Int, val address: String?) fun main() {     // Create a person with a nullable address     val person1 = Person("John Doe", 25, "123 Main Street")     val person2 = Person("Jane Doe", 30,

ANTLR ile Lexer Generation

Java platformunda bir lexer oluşturmak istediğimizde elimizdeki seçenekler JavaCC, SableCC ve ANTLR olarak karşımıza çıkıyor. ANTLR ile elimizdeki dil için bir lexer oluşturmaya çalışalım. Lexer için kullanacağımız dilin token kuralları: Identifier: Harf ile başlar. Harf, rakam ve alt çizgilerden oluşan stringdir. Büyük haft – küçük harf farklı olarak değerlendirilir. Integer constant: Rakamlardan oluşan string. Binary operator: Aşağıdakilerden biri: + - * / && Yorum: İki türlü yorum olabilir: Blok tipi yorum: /* */ Satır tipi yorum: // ANTLR kurulumu için yapılması gerekenler: Antlrworks'ü indir ve üzerine tıkla. En sevdiğin kafeinli içecek de dahil olmak üzere bilgilerini göndermeyi kabul et. ;) Yeni gramer dökümanı mı oluşturmak istiyorsun? Evet Grammar name: MyLexer Type: Lexer Lexical items: Identifier, Integer, Comments (single line + multiline), Whitespace Oluşturacağımız lexer için belirlenen kuralları ana pencerede görüyoruz: ID : ('a'..'z

"REGULAR EXPRESSIONS" KONUSUNU TAM OLARAK VE KOLAYCA ANLAMAK

Herhangi bir dilde yazılmış bilgisayar programının derlenebilmesi veya yorumlanabilmesi için öncelikle "lexical analysis" denilen aşamadan geçmesi gerekiyor. Bu aşamada program kelimelere veya "token" denilen yapıtaşlarına ayrılıyor. Programlama dilinin sentaksı, tokenlerin türleri hakkında bilgi verir. Örneğin birçok dilde yer alan bazı token türleri: ID Örnek: price calculateRate lastItem NUM Örnek: 73 0 REAL Örnek: 12.5 0.23 COMMA , IF if Bir lexical analyser (lexer) yazabilmek için herhangi bir programlama dili kullanılabilir. Fakat özellikle "regular expressions" dili bu iş için kullanıma uygun. Regular Expressions Dil (language), bir string kümesi olarak tanımlansın. Örneğin Java dili, legal java programı oluşturabilecek tüm string lerin kümesidir. Bu durumda Java dili sonsuz elemana sahip bir küme. Peki bir dili (belki sonsuz elemana sahip), nasıl sonlu ifadelerle (açıklamalarla) tanımlayabiliriz? İşte burad

nijhof2axon

Axon framework kullanıcılarına katkıda bulunmak amacıyla paylaştığım proje ile ilgili yorum ve sorular gelmeye başladı. http://code.google.com/p/nijhof2axon/ >>You share the Data between the Domain and the Query Model? When a command is dispatched, a CommandHandler uses the aggregate root to handle the command. Aggregate root fires DomainEvents. => Query layer related code listens to domain events and updates the query model. (Example: ClientTableUpdater) Domain entities are first class objects but Query Model classes are just DTOs with getters and setters. We have Client as entity and ClientDetailsEntry as DTO. >>The (generated?) table domainevententry looks like you can not replay events? missing the event data? To observe how events are replayed by the framework, you can follow these steps: Click on sample client change name stop server start server put a breakpoint to EventSourcingRepository.doLoad() method put a breakpoint to Client.handleClientNameChangedEvent() me

Saga Nedir?

"Saga", Domain Driven Design ve CQRS sözkonusu olduğunda sıklıkla duyduğumuz bir kavram. Saga, birden fazla Aggregate ile ilişkili bir "long-running business transaction" konusunda bize yardımcı olan bir yapı. Saga'lar Aggregate üzerinde doğrudan bir state değişikliği yapmıyor fakat oluşturduğu Command mesajları ile dolaylı olarak state değişikliğine sebep oluyor. Sagalar aynı zamanda Command nesnelerini ele alabilir ve Event'lere abone olabilir. Kısacası Saga, CQRS implementasyonlarında sıklıkla karşımıza çıkan ve DDD terminolojisinde ApplicationService adı verilen kavramla ilgili bir yapı. Bir sonraki yazıda örnek bir Saga implementasyonunu paylaşıyor olalım. Bahadır Konu bah(dot)konu(at)gmail(dot)com

Axon Framework ve tanımı değişen Event sınıfları

Axon Framework kullanarak geliştirdiğim CQRS uygulamasında karşılaştığım bir sorundan ve çözüm yollarından bahsedeceğim. Uygulamada "event sourcing" yöntemini kullanıyorum ve Event nesneleri SQL veritabanına serialize edildikten sonra kaydediliyor. Serialize edilen veri içerisinde Event sınıfının tam ismi (paket ismi ile birlikte) geçtiği için, bu isimde yapılan bir değişiklik (örneğin paket yapısındaki bir refactoring) benim mevcut event verilerim ile uyumsuz hale geliyor. Böyle durumlarda serialize edilmiş event verilerinin migrate edilmesi için 2 yöntemden bahsediliyor: 1) Genellikle bu durumda bir "Upcaster" yardımıyla eski tip eventler deserialize edilir. Yani uygulamamız deserialize sürecinde eski eventleri ele alabilmek için ayarlanmış olmalıdır. Axon framework'te EventUpcaster sınıfı incelenebilir. 2) Paket yapısında bir değişiklik olduğunda ve XStram kullanılıyorsa, eski paketten yeni pakete bir "alias" tanımlanabilir. // makes sure old packag

Loglama işleminin "spy appender" yoluyla test edilmesi

Loglama işlemi yapan bir sınıf, Logger nesnesini şu şekilde elde ediyor olsun: Logger log = Logger.getLogger(FinalExceptionHandlerImpl.class.getName()); Burada loglama işleminin yapılıp yapılmadığını test edebilmek için, Logger sınıfına bir "casus" appender enjekte ediyoruz. Sonuçta test sınıfımız aşağıdaki şekilde oluyor: @RunWith(MockitoJUnitRunner.class) public class FinalExceptionHandlerImplTest { private SpyAppender spyAppender = new SpyAppender(); FinalExceptionHandlerImpl handler; @Mock private MessagesUIConnector messagesUIConnector; @Before public void setUp() throws Exception { handler = new FinalExceptionHandlerImpl(); Logger.getLogger(FinalExceptionHandlerImpl.class.getName()) .addAppender(spyAppender); } @Test public void shouldLogErrorForException() throws Exception { Exception exception = new IndexOutOfBoundsException("message"); handler.handleException(exception, mess

Popular posts from this blog

Trie Data Structure and Finding Patterns in a Collection of Words

swapLexOrder: Finding lexicographically largest string

A Graph Application in Java: Using WordNet to Find Outcast Words