4 Eylül 2015 Cuma

Programlama Dillerinde Access Modifier Kullanımı

Giriş
Access Modifier'ın Türkçesi Erişim Belirleyici. Ama ben İngilizcesini kullanmayı daha uygun buldum.

C++
Sınıf seviyesinde access modifier
C++'ta Javadaki gibi class'ları gizlemek için access modifier yok. Burada classları gizlemek için bazı çözümler verilmiş.

1. İlk çözüm sınıfı bir başka sınıf içinde gizlemek.
Ben bu kullanım şeklini header dosyası halen görülebildiği için sevmiyorum. Örnek
class outer{
private: 
    class inner{
    private:
        int something;
    public:
        void print(){
            std::cout<< "i am inner"<<std::endl;
        }   
    };
public:
    inner returnInner(){
        inner i;
        return i;
    }  
};
Bu kullanım şeklinde aslında sınıf tam anlamıyla gizlenmiyor. (2) ve (3) ile işaretli satırlar halen derleniyor.
int main(){
    outer o;
    //outer::inner i = o.returnInner(); (1)
    //auto i = o.returnInner();         (2)
    //i.print();                  
    o.returnInner().print();          //(3)
    return 0;
}
C++11 ile nested sınıf dıştaki sınıfın private alanlarına da erişebiliyor.
A nested class is a member and as such has the same access rights as any other member.
a.) Arayüz ile kullanılması
Bir başka örnek'te tcp_stream nested olmasına rağmen belli bir arayüz gibi kullanılıyor.
class stream {
    virtual void write(const std::string text) = 0;
};

class channel {
public:
    virtual stream* get_stream() = 0;

    // Other methods...
};

class tcp_channel : public channel {
public:
    virtual stream* get_stream() {
        return new tcp_stream(this);
    }

private:
    class tcp_stream : public stream { /* implementation */ };
};
b) Kalıtım recursive olması
Bu kullanım şekli daha da tuhaf
class protocol {
public:
    virtual void create_connection() = 0;

    class tcp : public protocol { /* implementation */ };
    class shared_memory : public protocol { /* implementation */ };
    class named_pipes: public protocol { /* implementation */ };
};

auto media = protocol::tcp();
2. Header dosyasına yazmama çözümü
Diğeri ise gizlenmek istenen sınıfı header dosyası değil cpp dosyasına yazmak. Önce sadece Worker sınıfı .h dosyasında tanımlanıyor.
class Worker{
    //some class definition
};
Daha sonra Hidden sınıfı cpp dosyasında tanımlanıyor.
#include "worker.h"
class Hidden{
    //some class definition
};
//implementation of Worker class which uses Hidden class
Eğer  worker.h include edilse bile Hidden sınıfına erişilemez!
//if you only include the header, the class Hidden does not exist
#include "worker.h"
Bu kullanım şeklinin dezavantajı ise Hidden isimli ikinci bir sınıf daha yaratamamız. Her ne kadar dışarıdan erişim olmasa bile özellikle birim testlerde yaparken ikinci bir Hidden sınıfı yaratmak gerekiyor ancak yapamıyoruz.

Java
Metod ve Member Variable seviyesinde access modifier
Java'nın şöyle
            | Class | Package | Subclass | World
————————————+———————+—————————+——————————+———————
public      |  y    |    y    |    y     |   y
————————————+———————+—————————+——————————+———————
protected   |  y    |    y    |    y     |   n
————————————+———————+—————————+——————————+———————
no modifier |  y    |    y    |    n     |   n
————————————+———————+—————————+——————————+———————
private     |  y    |    n    |    n     |   n

y: accessible
n: not accessible



Friendly
Friendly package default anlamına gelir. Package default yerine bazen package private ta kullanılır. Sadece paket içinden erişim anlamına gelir.

Protected
Protected olan alana, sınıf'tan kalıtanlar (farklı paket içinde olsa bile) ve aynı paket içinde olan sınıflar (kalıtım ilişkisi olmasa bile) erişebilirler.

Interface
Interface içindeki metodlar yazılmasa bile public kabul edilir. Örnekte f metodu public'tir.
public interface MyInterface {
  void f();
}

Sınıf seviyesinde access modifier

package-private
Sınıfın başına hiç bir access modifier yazılmazsa package-private kabul edilir. Sınıf sadece içinde bulunduğu paket tarafından erişilebilir.  Örnek'te  animals paketini import eden kişi Platypus sınıfına erişemeyeceği gösteriliyor.
package animals;

public class Animal { ... };

public class Giraffe extends Animal {
    void Run() { ... }
    public void Jump() { ... }
}

class Platypus extends Animal { ... }

C#
Sınıf metodlarının default access modifier seviyesi private'tır. Yani dışarıdan erişilemezler.
Sınıfların default access modifier seviyesi internal'dır. Yani sadece kendi assembly'sinden erişilebilir.

Internal
Şöyle tanımlanıyor.

The internal keyword is an access modifier for types and type members. Internal types or members are accessible only within files in the same assembly, as in this example

Internal bir field örneği
public class MyClass 
{
    // Only accessible within the same assembly
    internal static int x = 0;
}



Hiç yorum yok:

Yorum Gönder