Statik sınıflar ile adaptör desen

0 Cevap php

PHP 5.x statik sınıflar ile Adaptör deseni uygulamak için iyi bir yol arıyorum

One of the examples where I would like to use this, is as a counterpart to Python's os.path.join(). I would have two adaptees, a Windows and a Linux adaptee class.

Hiçbir "bağlam" var çünkü, statik sınıflar olarak bu sınıfları uygulamak için, makul olduğunu düşünüyorum. Onlar herhangi durumunu saklamak gerekiyor ve ben bir gereksiz görünüyor gerek bir örneği her şey yaratmak değil - bu yüzden ben bunu uygulamak için temiz bir yol arıyorum.

En aşağıdaki sahte uygulama düşünelim:

    static public function join(){
        $parts = func_get_args();
        $joined = array(MY_MAGICALLY_PASSED_DEFAULT_PATH_PREFIX);
        foreach($parts as $part){
            $part = self::$adaptee->cleanPath($path);
            if(self::$adaptee->isAbsolute($part)){
                $joined = array($part);
            }
            else{
                $joined[] = $part;
            }
        }
        return implode(PATH_SEPARATOR, $joined);
    }

Göreceksiniz ilk şey gerekli, OS-bağımlı uygulama ayrıntılarını yapacağını adaptee adında bir başlatılmış statik üyesi varsayar olmasıdır.

Bu benim sınıf ilanından hemen sonra diyebileceğim, rasgele adlandırılmış bir statik yapıcı gibi bir işlevi olması beni gerektirir. (Bu yaklaşım ile beni rahatsız başka bir şey).

Tabii ki, ben her yöntem çağrısı yerel $adaptee değişkeni başlatılamadı, ama bu uygunsuz gibi görünüyor ve ben adaptee ihtiyacı birbirlerine statik fonksiyonu çoğaltmak gerekir.

Şimdi ... PHP'nin sınıf Gerçekleştiren ayrıntı için: Bunlar birinci sınıf nesneler değildir, bu yüzden sadece bir argüman olarak sınıf geçmek olamazdı. Örnekte, non-static (bu terim için nedir?) Sınıfları, o zaman örneğini ve sonunda statik $adaptee üye değişken atamak gibi Adaptees oluşturmak açmamı Adaptör sınıfı.

Belki de bu benim var sadece bu tuhaf ve tamamen subjektif bir düşünce ... ama gerçekten bu gibi bunu yapmak için uygun olmadığını hissediyorum. Eğer daha iyi uygulanması hakkında herhangi bir fikir var mı?

Ben yaşadım başka bir fikir yerine adaptee sınıf adını saklamak, ve call_user_func yerine kullanmak için, ama bu yaklaşımı kullanarak çok rahat hissetmiyorum.

Update

Ben doğru bu tarif olmayabilir, bu yüzden bir güncelleştirme bu açıklamaya çalışacağım:

Ben altta yatan İşletim Sistemi almak için nasıl arıyorum değil, ama bir statik sınıf OS Linux, Windows, FreeBSD ya da başka bir şey olup olmadığına bağlı olarak farklı hareket için ben, düzgün bir yol var istiyorum.

Ben adaptör desen düşündüm, ama ben statik bir kurucuya sahip olmadığı için, ben gerçekten sınıf başlatmak olamaz. Tek yönlü (sadece ya da başlatılmış olup olmadığını kontrol) her kamu statik yöntem çağrısı başında başlaması olacaktır.

Diğer olasılık, olacak bir statik yapıcı benzeri yöntemi oluşturmak için ve sadece sağ ilanından sonra diyoruz. Bu işi olabilir, ama ben sadece bu ulaşmak için, orada ne diğer, muhtemelen daha fazla elgeant yöntemleri merak ediyorum.

As for my initial example: It is supposed to be a utility function, it does not need to preserve state in any kind really, so I am not looking for a Path-Object of any sorts. What I would like, is a Path factory function, that returns a string, without having to differentiate between the different OSes every time when called. The "library"-thing led me to create a static class as pseudo-namespace for my related utility functions, and the different implementation details that need to be supported to the adaptor pattern. Now I am looking for an elegant way, to combine the two.

0 Cevap