Pointcut yapısı bölümünde sorulan soruların cevaplarını ve açıklamalarını bu kısımda bulabilirsiniz.
public aspect AbstractAspect {
public abstract pointcut doPointcut();
}
public aspect ConcreteAspect extends AbstractAspect {
protected pointcut doPointcut():execution(public String Address.getCity());
}
- Yukarıdaki kod parçacığına göre sizce hangi şık(lar) doğrudur?
-
-
❏ a) Doğru olarak derlenir
-
❏ b) Doğru derlenmesi için soyut pointcut’ın
public
belirleyicisiprotected
olmalı -
❏ c) Doğru derlenmesi için somut pointcut’ın
protected
belirleyicisipublic
olmalı -
❏ d) Doğru derlenmesi için 2 pointcut tanımının
private
olması gerekir -
✓ e) Hiçbiri değil
-
Cevap: E
Açıklaması:
AbstractAspect
ve ConcreteAspect
ilgilerinin bulunduğu paket erişimine bakılmaksızın en başta ilgilerin tanımlarına bakılması gerekilir. Sorudaki AbstractAspect
ilgisi somut yapıda singleton
karakterine sahiptir ve abstract
anahtar kelimesiyle soyut bir özelliği bünyesinde barındırmamaktadır. Bu nedenle, soyut bir pointcut soyut bir ilgi içerisinde tanımlanamayacağı için a, b, c ve d şıkları yanlıştır. Şayet AbstractAspect
ilgisi abstract
olsaydı, b ve c şıkları doğru olacaktı. Erişim seviyeleri default
(paket korumalı - varsayılan) → protected
→ public
önceliğini taşıdığı için hem soyut hem de somut pointcut yapılarındaki erişim belirleyiciler aynı olmalıdır (paket erişimine bakılarak düzenlenmeli) ya da erişim seviyesine göre düzenlenmelidir yapılar. Örneğin; protected
olan soyut pointcut tanımı, diğer ilgilerde public
olarak değiştirilmelidir erişim seviyesi bakımından.
package com.book;
public class Library { }
package com.book.store;
public class BookStore extends Library { }
package com.book.staff;
class Librarian extends Library{}
package com.book.staff;
interface Controllable {}
package com.book.store.business;
class BookStoreBusiness extends BookStore { }
- Hangi birimler
within(com.book.store+.BookStore)
ile etkilenir? -
-
❏ a)
Library
-
❏ b)
BookStore
-
❏ c)
Controllable
-
❏ d)
BookStoreBusiness
-
✓ e) Derleme hatası
-
Cevap: E
Açıklaması:
within
içerisinde yazılan tip imza deseni yanlıştır. Doğrusu: com.book.store.BookStore+
olarak düzeltilmelidir. Düzenlenmiş tip deseni ile tekrar soruya bakılırsa BookStore
ve ondan türeyen BookStoreBusiness
sınıfları etkilenmektedir.
package com.book;
public class Library {
protected String libraryName;
public void doSomethingMore(Object object, byte b) {
libraryName = "D&R";
}
public static void doWhat() {}
}
package com.book.aspects;
public aspect ObjectModule {
pointcut doPointcut(Library lib) : target(lib);
after(Library lib): doPointcut(lib){
System.out.println(lib.libraryName);
lib.doWhat();
}
}
- Yukarıdaki kodun hatasız çalışması için hangi seçenek(ler) yapılmalıdır?
-
-
✓ a)
libraryname
ismindeki alanpublic
olmalı -
❏ b) Statik metod olan
doWthat
,Library.doWhat()
olarak yazılmalıdır -
❏ c) Statik metodlar tavsiye içinde çalışmazlar.
-
❏ d)
libraryname
ismindeki alandefault
olmalı -
❏ e) Kod hatası yoktur
-
Cevap: A
Açıklaması:
Tavsiye yapılarının gövdesinde çağırılan nesneye ait üyelerin ya public
olarak tanımlanması ya da private
hariç protected
ve erişim belirleyicisiz olması gerekmektedir. Bu sorumuzda hem ilgi hem de sınıf farklı paketler içerisinde oluşturulmuştur bu yüzden protected
olan libraryName
nesne değişkeni sadece com.book
içerisinde tanımlanan ilgilerin tavsiye gövdelerinde gözükür. Bu durumda en sağlıklısı libraryName
değişkeninin public
olarak değiştirilmesi gerekmektedir ya da bu alanın sistemde protected
kalması gerekmekte ise ayrı bir public
getter metodu yapılarak bu alana bu metod sayesinde ulaşabiliriz.