Bir yardımcı nedir? Bu bir tasarım deseni mı? Bir algoritma mı?


40

Belki biraz yanak dili, ancak bu cevabı Google üzerinden hiçbir yerde bulamadığım için, Yazılım Mühendisliği'nin cevabını sağlamak için:

Bir yardımcı nedir?

Her yerde kullanılan ismin (modül isimleri, sınıf isimleri, metot isimleri), anlambilim derin ve anlamlıymış gibi görmüştüm ama Bilgisayar Bilimi bağlamında (içinde bir derecem olmamasına rağmen) hiçbir yerde bir tanım veya tanım görmedim!

Bu bir tasarım deseni mı? Bir algoritma mı? Bir zamanlar modülün ve sınıfın hem bir şey daha iyi bir şey olarak adlandırılan bir program üzerinde çalıştım (bir şeyin de oldukça genel olduğu bir program ) ve derhal onu bana anlamlı gelen bir şey olarak yeniden adlandırdım, ama burada bir şeyleri özlüyorum gibi hissediyorum!


9
Yardımcı, ne diyeceğinizi bilmediğiniz bir şeyi adlandırırsınız ancak arkadaşlarından birini tanırsınız. Aaron yerine "Zack arkadaşı" demek gibi. Çifte artı ungood.
david.pfx

Bir yardımcı izomorfizme kadar herhangi bir özel üyedir.
Thomas Eding

@ThomasEding 3 yıl sonra geri döndüğüm için üzgünüm - ama arayüzler de dahil olmak üzere "yardımcı" adlı birçok "genel" üye gördüm. Tanımınızla ilgili bir kaynak istiyorum (daha yüksek kalite daha iyi) çünkü bu bana daha fazla kod kokusu için bir anlam verecekti.
Aaron Hall

Yanıtlar:


63

Bir Yardımcı sınıf, bir kodlayıcının bazı çeşitli, yaygın olarak kullanılan işlemleri tanımladığı ve doğal olmayan bir gruplamada bir araya getirerek yeniden kullanılabilir hale getirmeye çalıştığı daha az bilinen bir kod kokusudur. Ardından başarılı geliştiriciler projeye katıldılar ve yardımcı sınıfın var olduğunu fark etmediler ve sonuçta aynı ortak işlemleri yeniden yazdılar, hatta daha fazla Yardımcı sınıf oluşturdular.

Fakat cidden, Yardımcı sınıflarla ilgili temel sorun, genellikle belirli bir sınıf üzerinde hareket eden operasyonlar olmalarıdır; bu, açıkça OO terimlerinin akut bir Feature Envy olgusundan muzdarip oldukları anlamına gelir . Davranışı, üzerinde çalıştığı verilerle paketlememe hatası, geliştiricilerin bu kadar sık ​​(benim deneyimime göre) bulamama nedenleridir.

Buna ek olarak, daha önce tanımladığınız gibi SomethingSomethingHelper aslında korkunç bir isim. Tanımlayıcı değildir ve size sınıfın ne tür işlemler gerçekleştirdiğine (yardımcı olur mu?) İlişkin gerçek bir ipucu vermez; bu, aynı zamanda Yardımcı sınıfa ait olup olmadığına dair yeni davranışlar eklerken de açık olmadığı anlamına gelir. Bu gibi sınıfları, mantıksal olarak birlikte gruplanan ilgili davranış çizgileri boyunca böler ve sonra da yeni sınıfları ne yaptığını yansıtacak şekilde yeniden adlandırırdım.


9
SomethingSomethingHelperBu sınıfın asıl adı olmadığından eminim . Bunun bir kod kokusu olup olmaması , yardımcı sınıfın ne kadar spesifik olduğuna bağlıdır , çünkü yardımcı sınıflar Mathbir kod kokusu değildir.
Robert Harvey,

10
@RobertHarvey - Enh, gördüğümlerin çoğu isimlendirildi SomethingSomethingHelper. Cehennem, şu anda adında bir sınıf bakıyorum HelperMethodsiçinde <company>.Helpersad. Bana göre, bir Helpersınıf aynı kovada *Manager.
Telastyn

8
@Telastyn: Belki de bu bir deneyim meselesi o zaman. Mevcut projemdeki yardımcı sınıfları inceledim (birkaç tane var) ve hepsinin anlamlı isimleri var. Eklenmiş tek bir tane var Helperve bence aynı adı taşıyan .NET Framework'teki bir sınıftan ayrılmayı düşünüyorum. Anlamlı bir şey *Helperolsaydı *, kabul edilebilir sayılırdım . HelperMethodssadece hayal gücünün bir başarısızlığıdır; En azından belirli kavramsal kovalar olmalı.
Robert Harvey,

4
@RobertHarvey - Muhtemelen haklısın. Modern dilleri kullanan kariyerimin tamamı tren enkazlarını temizliyor.
Telastyn,

1
Bunların "yardımcı fonksiyonlar" adı verilen ve aslında faydalı ve iyi bir desen olan alt kümesi var. Örneğin, bir işlev içinde başka şekilde tekrarlanması gereken ortak bir satır kümesi - gösterdikleri yerlerin bir örneği, do..whilePython'da dilin desteklemediği bir döngüye ihtiyacınız olduğunda ( burada ikinci örneğe bakın ). Bir başkası bir if / elif /.../ başkası bir yapı olacaktır, ancak üst ve alt kısımda bir vakayı tekrarlaması gerekir. Mümkünse, bu fonksiyona yerelleştirilmeleri gerekir ve genellikle "yardımcı" olarak adlandırılmazlar.
Izkata

5

Bir yardımcı, harici bir bileşeni tamamladığı sürece zararsız bir ek sınıf veya yöntemdir. Aksine, o zaman kötü bir tasarıma işaret eder, çünkü herhangi bir otorite varsa, kod otoritesinden çıkarılmıştır.

İşte zararsız bir yardımcının örneği, FindRepbaştaki sıfır sayısını sayan bir yöntem kullanıyorum .

digits = digits.Remove(0, TextHelper.FindRep('0', digits, 0, digits.Length - 2));

Yardımcı yöntem çok basittir, ancak etrafına kopyala yapıştırmak çok zordur ve çerçeve herhangi bir çözüm sağlamaz.

public static int FindRep(char chr, string str, int beginPos, int endPos)
{
    int pos;

    for (pos = beginPos; pos <= endPos; pos++)
    {
        if (str[pos] != chr)
        {
            break;
        }
    }

    return pos - beginPos;
}

Ve burada kötü bir yardımcı örneği:

public static class DutchZipcodeHelper
{
    public static bool Validate(string s)
    {
        return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase);
    }
}

public class DutchZipcode
{
    private string value;

    public DutchZipcode(string value)
    {
        if (!DutchZipcodeHelper.Validate(value))
        {
            throw new ArgumentException();
        }

        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }
}

-1

Şirketim, her nesnenin iki sınıfa sahip olacağı Temel sınıf / Yardımcı sınıf metodolojisini kullanırdı. Tüm sınıf özelliklerini ve tanımlarını içeren bir Person sınıfına ve Person sınıfını işleyen tüm yöntemleri, SQL deyimlerini ve Mantığa sahip bir PersonHelper sınıfına sahip olacaksınız. Bu, bizim için iyi sonuç verdi, çünkü tüm uygulamalarımız, verileri işlemek için SQL ifadeleri kullanıyor ve gerektiğinde SQL ifadelerini bulmak ve değiştirmek bizim için çok kolaydı.

O zamandan beri devam ettik ve şimdi her şeyi Person / Base sınıfına yerleştirdik. Yardımcı adlandırma kurallarını kullanmayı bıraktık, çünkü projelerimizde daha az dosya olmasını istedik. Ayrıca, bazı sınıf adlarının uzunluğu kontrolden çıkıyordu. lol.

Harika bir örnek değil, ama siz anladınız.

s = CompanyName.PersonHelper.GetPerson()
s = CompanyName.Person.GetPerson()

Yardımcı adlandırma kurallarını kullanmanın mükemmel bir çözüm olduğunu söylemiyorum ama birkaç yıl bizim için işe yaradı.


2
Nedenini açıklamadın.
Robert Harvey,

2
Evet, ben de bu açıklamayı istiyorum.
Aaron Hall

@AaronHall Seçimlerini anlamadığınız iyi bir şey olarak düşünün.
Leopold Asperger
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.