Arabirim adlandırma: önek 'Can-' vs sonek '-Able'


29

'-Able' ifadesini arayüzler için sonek olarak kullanmak yaygındır;

Sıralanabilir Yazdırılabilir Numaralandırılabilir İçilebilir Atılabilir Döndürülebilir

'Can-''ın daha iyi olabileceğini düşünüyordum çünkü daha açıklayıcı olabilir. Evet, daha çok endişe verici ve arayüz adına ses ekliyor. Özellikle pasif fiiller kullanılabilir.

Örneğin 1 , Shootable, nesnenin ateş edebileceği anlamına gelir (bir silah bunu uygulayabilir) veya vurulabileceği anlamına gelir (bir hedef tahtası bunu uygulayabilir). 'Can-' öneki ile eski "CanShoot", ikincisi "CanBeShotAt" veya "CanShootAt" olur.

Örn. 2 'CanBePrinted' belgesi ve bir yazıcı 'CanPrint'

Ya da '-Able' ile yapışmalı ve belgelerin içeriği sağlamasına izin vermeli miyiz ?

Herhangi bir görüş


Dostum, "-able" kullan. Dönemi.
Tulains Córdova

2
class Cannibal implements Can, Able {}
İkisini

Yanıtlar:


18

Belki de mümkün-mümkün mü?

.Net'ten bazı örnekler:

NetworkStream.Readable
NetworkStream.Writable
Stream.CanRead
Stream.CanWrite
Type.IsSerializable

Tek tip bir standart görünmüyor. İyi okuyanlarla devam et.

if (document.IsPrintable && printer.CanPrint) { printer.Print(document) }

EDIT: Belirttiğimiz gibi, soru Özellikler ile değil Arayüzlerle ilgilidir.

Bu durumda, Can- isimli bir arayüz bulamıyorum. Arayüzler her zaman kullanılabilme eğilimindedir. Bu terminolojiye katılırdım. Bir yöntem, a ISerializable objectveya parametresi olarak isteyebilir IPrintable document. Bir ICanBeSerialized objectveya a istemek ICanBePrinted documentokumak çok zordur.

Diğer tarafta, Yazıcı, sadece arayüzü çağırmanızı öneririm IPrinter. Yöntemin bir soruyor olacak IPrinter device.

Aşağıdaki yöntem imzasını sesli olarak okuyun. (Şahsen, ben "Ben" önekinin sessiz olduğunu düşünüyorum.) İyi okuyor mu? Sesi doğru mu?

void PrintDocument(IPrinter device, IPrintable document)
{
    device.Print(document)
}

2
Document.IsPrintable, Document.CanBePrinted'den daha iyidir. Söyleyebileceğim kadarıyla pasif sesten kaçınabildiler.
Thanos Papathanasiou

"Basılabilir", "yazdırılabilir" den daha uygun bir İngilizce gibi görünüyor.
Danny Varod

1
"Odak harekete geçtiğinde pasif ses kullanılır. Ancak eylemi kimin ya da ne yaptığı önemli değildir ya da bilinmez." Sadece odağın eylem üzerinde değil nesnenin üzerinde durmasını istediklerini tahmin edebiliyorum. Öyleyse, bir "Type.IsSerializable" bir istisna atarsa, bu Type'ın hatasıdır. yöntem değil 'ancak bir "Type.CanBeSerialized" bir istisna atarsa, yöntemi değil, türü de suçlarsınız. Kuşkusuz fark küçük ama var.
Thanos Papathanasiou

3
Bunun kabul edilen cevap olduğunu görüyorum, ancak bu OP'nin sorusuna cevap vermiyor. Sağlanan örnekler Mülk adlarıdır. OP için adlandırma kuralı istiyor Arayüz gibi isimler, ISerializable, IDataErrorInfo, ve INotifyPropertyChanged.
Kevin McCormick

@KevinMcCormick, iyi nokta! Yukarıdaki düzenlemeler.
El-E-Yemek

23

Dilbilgisi ile konuşursak, "canFoobar" bir işarettir, oysa "Foobarable" bir sıfat ya da bir isimdir (genellikle bir API bağlamında bir isimdir).

Ayrıca dikkat çeken farklılığa dikkat edin: -able, uygulandığı isime pasif bir rol ima eder, yani eğer bir Şey foobarable ise, o zaman başka bir şey tarafından foobarred edilebilir; Aktif bir rol oynayabilir, yani, eğer bir şeyFoobar yapabilirse, o zaman başka bir şey için foobar yapabilir. Ya da, farklı bir açıdan: Bir B, daha sonra filanca eğer A.canFoobar()ve B is Foobarable.

OOP etkililiği açısından, isimler sınıflar veya arayüzler iken, öngörüleri yöntemlerle veya özelliklerle ilişkilendiririm. Yani:

instance.canFoobar();

class Something implements Foobarable { ... }

7

Şahsen ben -able sürümü ile sopa. İşte benim sebebim: Çoğu (tümü?) Grafik editörleri, yazdıklarınızı temel alarak tanımlayıcıları önerir. Bazıları tanımlayıcılar içinde arama yapmak için yeterince 'akıllı' olmasına rağmen, bazıları hala sadece tanımlayıcıların arama başlangıçlarını sunar.

Yazmayı hızlandırmak için, önerilen tanımlayıcıların listesini mümkün olduğu kadar az tuşa basarak kısaltmak istersiniz. Daha fazla tanımlayıcı aynı başlangıca sahiptir, örneğin 'ICan', daha fazla karakter yazmanız gerekir.

Bunun sizin durumunuzda bir sorun olmadığını düşünüyorsanız o zaman bu harika ve bir adlandırma kuralı seçmek için başka kriterler kullanmanızı tavsiye ederim. Bazı durumlarda, örneğin ekibimizde, mümkün olduğu kadar az tuşa basmadan sonra ayırt eden tanımlayıcıları tercih ediyoruz.

Bunun dışında, kodunuzu projede çalışanlar için daha anlaşılır kılan adlandırma kurallarını kullanmanızı tavsiye ederim. Takımın içinde sohbet et. Böyle bir hak ya da yanlış yoktur. Sadece işe yarayan sözleşmeler ve daha az işe yarayan sözleşmeler.

Unutmayın ki iyi refactoring araçları şeyleri istediğiniz sıklıkta yeniden adlandırmanıza izin verir. Bu yüzden farklı yaklaşımlarla denemek kolaydır.


1
+1. Benim akıl yürütme aynı olacaktır, ilk önce IDE'de arama / bulma / sıralama işlemlerini kolaylaştırmak için kontrol fiilini koymak.
pap

1
intellisense sadece bu şekilde çalışmakla kalmıyor, aynı zamanda insan tarama metni de yapıyor, önekler kodunuzu daha az okunabilir hale getiriyor
jk.

7

Açıkça, önek ve sonek, farklı eylem türleri veya bir eylemin farklı yönleri için neredeyse açık seçimlerdir .

Mevcut kullanım ve tercihler, birçok nedenden dolayı tutarsız olabilir.

Eylem yapılır tarafından nesne:
CanShoot -> Bu sürgünler (at) bir şey
canFly -> O uçar
canchange -> Bu değişikliği

Eylem yapılır üzerindeki objenin:
Okunabilir -> Sen bunu okuyabilir
Writable -> Sen bunun (kadar) yazabilirsiniz
Yazdırılabilir -> Sen yazdırabilirsiniz

Bir kural olmasa ve hatta mantıklı bir şekilde mantıklı olsa da, sözleşmeyi benimsemeye ve değişken adlandırmada kullanım tutarlılığını sürdürmeye yardımcı olur.


4

Yetenek ve izin arasında ayrım yapmak isteyebileceğinizi düşünüyorum. Bir şeyin serileştirilebildiği anlamına gelir Serializableve CanSerializeima ederken , ayrıca izin sorunları da olabilir (veya belki de disk alanı eksikliği) ve göz önünde bulundurmanız gerekebilir MaySerialize. Bir şeyleri bırakmak, ve ~ablearasında ayrım yapma ihtiyacını ortadan kaldırır .canmay


Seri hale getirilebilirIfNotDiskFullAndIfNotPermissionMissing ... Lol :)
Max

2

Arabirimleri alt sınıflarken / uygularken, kuralın "B'nin A olduğunu" (B'nin A'yı uyguladığı) söyleyebilmeniz gerektiğini düşünüyorum. Söylemek doğru gelmiyor:

Bir Documenta,CanBePrinted

Ancak şunu söylemek doğru (veya en azından daha iyi) geliyor:

Bir Documenta,Printable


2

Hem gramer hem de geleneksel Xable'ın arayüz isimleri için daha iyi olduğunu düşünüyorum, IsX, CanX, DoesX ise özellik isimleri için daha iyi.

MSDN'den:

"Boolean özelliklerini olumlu bir cümle ile adlandırın (CantSeek yerine CanSeek). İsteğe bağlı olarak, Boolean özelliklerini ayrıca Is, Can veya Has ile de ekleyebilir, ancak değer katar." http://msdn.microsoft.com/en-us/library/ms229012.aspx


Yardımcı link için +1;
Nelere

0

Bence "-able" varyantı, daha fazla deve humps uygulayan "CanDoSomething" önerdiğinizden çok daha okunaklı.


1
ve Can daha bir yöntem adıdır
cırcır ucube

Mülk adı - MSDN’ye bakın. Bir yöntem adları "fiiller veya fiil cümleleri" olmalıdır. Ayrıca, birden fazla humps'ın nesi var?
Danny Varod

0

Scala'da *Ablearayüzler için kullanılır, ancak Can*tip sınıfı deseni için kullanılır. Temel olarak, belirli yöntemleri çağırabilmek için, belirli bir türde örtülü bir değerin kapsamı içinde bulunması gerekir. Bu türün adı bazen önceden eklenmiştir Can.


Can * bir sınıf için iyi bir isim değil. MSDN'den Alıntı: "Sınıfları, arayüzleri ve değer türlerini isimler, isim cümleleri veya bazen sıfat cümleleriyle, Pascal kaseti kullanarak adlandırın", link: msdn.microsoft.com/en-us/library/ms229040.aspx İyi isim sınıf Belge, kabul edilebilir ad Yazdırılabilir olur.
Danny Varod

Scala dilinde bir örnek CanBuildFrom. Bu bir sıfat olur. Bu sınıfın kullanım durumu diğer sınıflardan çok farklıdır. Bu sınıfın örnekleri neredeyse hiçbir zaman müşteri tarafından oluşturulmaz ya da çözümlenmez - bunun yerine belirli türler için kapsamda bulunurlar. Belli bir tür için uygunsa, bu tip sınıfı talep etmek için işaretlenmiş bu türden içeren yöntemler çağrılabilir. Bu, alt tiplendirmeden daha esnek bir genişletilebilirlik mekanizması sunmak için mevcuttur. Bkz scala-lang.org/node/114 .
axel22

Sadece gerçek bir rolü olmadığından ünite testleri için arayüzler uygulayan sahte sınıflar için sıfat öbekleri kullanmayı hatırlıyorum.
Danny Varod
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.