Eğer birisi getter / setter yöntemlerini kullanmadan dahili bir $ _fields değişkeni erişilebilir olacak şekilde kod yazarsa, bunu tanımlamak için kullanılan uygun bir terim var mı?
Yönetim ile kullanmak için yeterince kibar bir şey :)
Eğer birisi getter / setter yöntemlerini kullanmadan dahili bir $ _fields değişkeni erişilebilir olacak şekilde kod yazarsa, bunu tanımlamak için kullanılan uygun bir terim var mı?
Yönetim ile kullanmak için yeterince kibar bir şey :)
Yanıtlar:
Özel üyelerin teşviki kibar toplumda asla iyi bir şey değildir ...
Bu uygulama / zayıf kapsülleme eksikliğidir.
private
) kapsülleme kavramının başka bir uygulamasına daha sahiptir.
__
ad yönetimi için kullanmalıdır ). Diğer diller de zayıf kapsülleme özelliğine sahip olabilir, örn. Java'da yansıma ve özel değişkenlere ulaşmak için C ++ 'da işaretçi aritmetiği. Python bu sözdizimini o hantal yapmak için yapmaz.
__
ad yönetimi kullanır . Olmadan, __
tasarım hala iyi kapsüllemeyi yansıtır. "Kamusal" ın "eksik / zayıf kapsülleme" anlamına geldiğini iddia etmek yanlıştır. Kavram hala mevcut. Kaynak kodu uygun dekorasyona sahip değildir.
Oded tarafından daha önce sözü edilen kapsülleme eksikliğinin yanı sıra, programlama diline ve paradigmalarına bağlı olarak, "düz eski veriler" de olabilir (burada mutlaka bir antipattern veya kod kokusu değildir).
Bir özellik çantası denir.
Genellikle bir dizi ilgili özelliklerin tutulması için kullanılır (her biri potansiyel olarak uygun erişim belirteçlerine sahip olan veya olmayan bir sınıf nesnesi olabilir). Ancak çevredeki yapı sadece bir çanta özelliği.
Buna "belirli bir kodlama standardını izlememe" denir.
OP şunu yazdı:
dahili bir $ _fields değişkeni getter / setter yöntemleri kullanılmadan erişilebilir
Bu, standardınıza aykırı olabilir ve (böylece) kod kokusu olabilir. Ancak mutlaka zayıf bir kapsülleme değildir . Bir alıcı ("yalnızca dahili kullanımda" olduğu gibi) bir alıcı ve ayarlayıcılar üzerinde dış dünyaya maruz kalmak daha da kötü olurdu.
Soru şu: $_fields
dış dünya için erişilebilir olmalı mı?
Öyleyse, getter / setter yöntemlerini ekleyeceğiniz bir durumumuz var. Bu yöntemler $_fields
, bir çeşit değişken olan gerçekten başka hiçbir şeyi kapsamaz (hesaplanan / getirilen / vb. Anında) aksine. Dile bağlı olarak, muhtemelen türü (uygulama detayı olarak da bilinir) dışarıya sızdırırsınız. İster alıcılar / ayarlayıcılar isteyin, ister yalnızca "gerekli" olduğunda kodlama standart bir konudur.
Eğer $_fields
gereken değil erişilebilir, daha sonra, iyi, erişmek yoktur. Başkalarının dil düzeyinde (özel ve arkadaşlar) erişmesini engellemeniz gerekip gerekmediği (belirli durumlarda hata ayıklamayı kolaylaştırabilir) - yine - kodlama standart bir konudur.
Kapsülleme sorunu tamamen buna diktir. Kapsüllemeyi ihlal etmek alıcılar ve pasiflerle kesinlikle mümkündür. Kayması daha da kolaydır , çünkü çoğu insanın alarm zilleri, bir sürü alıcı ve ayarlayıcı gördüklerinde çalmaz - görünüşte en iyi uygulamaları takip eden kod. Kod, bu çok iyi denilen bir değişken daha dahili uygulama ayrıntılarını çok daha bağımlılıkları tanıtmak olabilir $_fields
değil olduğu gibi belirtilecek private
.
Ben kötü analojilerin hayranıyım: Zayıf kapsülleme demek silah tutan birine katil demek gibidir.
Bu değişkenlere genel üye değişkenleri diyorum .
ayarlayıcı / alıcı yöntemleriniz başka bir şey değilse
void setfoo(bar){foo=bar;}
foo getfoo{return foo;}
kasık değişkeni yapmak, farkın önemli olduğu birkaç uç durumun dışında bazı yazımları kurtarıyor.