Skip to content

Latest commit

 

History

History
101 lines (75 loc) · 4.14 KB

appendix-10.asc

File metadata and controls

101 lines (75 loc) · 4.14 KB

Appendix A: Bölüm 3 Cevaplar

Pointcut yapısı bölümünde sorulan soruların cevaplarını ve açıklamalarını bu kısımda bulabilirsiniz.

Soru 1:
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 belirleyicisi protected olmalı

  • ❏ c) Doğru derlenmesi için somut pointcut’ın protected belirleyicisi public 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) → protectedpublic ö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.

Soru 2:
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.

Soru 3:
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 alan public olmalı

  • ❏ b) Statik metod olan doWthat, Library.doWhat() olarak yazılmalıdır

  • ❏ c) Statik metodlar tavsiye içinde çalışmazlar.

  • ❏ d) libraryname ismindeki alan default 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.