Apa itu pembantu? Apakah ini pola desain? Apakah ini sebuah algoritma?

40

Mungkin sedikit bingung, tetapi karena saya tidak dapat menemukan jawaban ini di mana pun melalui Google, maka untuk memastikan Rekayasa Perangkat Lunak memiliki jawabannya:

Apa itu pembantu?

Saya telah melihat nama yang digunakan di mana-mana (nama modul, nama kelas, nama metode), seolah-olah semantiknya dalam dan bermakna, tetapi dalam konteks Ilmu Komputer (meskipun saya tidak memiliki gelar di dalamnya), saya Saya belum pernah melihat deskripsi atau definisi di mana pun!

Apakah ini pola desain? Apakah ini sebuah algoritma? Saya pernah bekerja pada sebuah program di mana modul dan kelas keduanya disebut somethingsomethinghelper (di mana sesuatu juga cukup generik) dan saya segera menamainya menjadi sesuatu yang masuk akal bagi saya, tetapi saya merasa seperti kehilangan sesuatu di sini!

Aaron Hall
sumber
9
Helper adalah apa yang Anda sebut sesuatu ketika Anda tidak tahu harus menyebutnya apa tetapi Anda tahu salah satu temannya. Agak seperti memanggil Anda 'teman Zack' bukan Aaron. Double plus ungood.
david.pfx
Penolong adalah anggota pribadi apa saja, hingga isomorfisme.
Thomas Eding
@ThomasEding maaf untuk kembali 3 tahun kemudian - tetapi saya telah melihat banyak anggota "publik" bernama "helper", termasuk antarmuka. Saya ingin sumber pada definisi Anda (semakin tinggi kualitas semakin baik) karena itu pasti akan memberi saya rasa untuk lebih banyak bau kode.
Aaron Hall

Jawaban:

63

Kelas Helper adalah bau kode yang kurang dikenal di mana seorang pembuat kode telah mengidentifikasi beberapa operasi lain yang umum digunakan dan berusaha membuatnya dapat digunakan kembali dengan menyatukannya dalam pengelompokan yang tidak alami. Pengembang yang berhasil kemudian datang ke proyek dan tidak menyadari bahwa kelas helper ada, dan akibatnya menulis ulang operasi umum yang sama, atau bahkan menciptakan lebih banyak kelas Helper.

Tapi serius, masalah utama dengan kelas Helper adalah bahwa mereka biasanya operasi yang bertindak pada kelas tertentu, yang jelas berarti dalam istilah OO bahwa mereka menderita kasus akut dari Fitur Envy . Kegagalan untuk mengemas perilaku ini dengan data yang ditindaklanjutinya adalah mengapa pengembang begitu sering (menurut pengalaman saya) gagal menemukannya.

Selain itu, karena Anda telah mengidentifikasi SomethingSomethingHelper sebenarnya adalah nama yang mengerikan. Ini tidak deskriptif, dan tidak memberi Anda firasat nyata tentang operasi apa yang dilakukan kelas (itu membantu?), Yang juga berarti bahwa tidak jelas ketika menambahkan perilaku baru apakah mereka termasuk dalam kelas Helper atau tidak. Saya akan memecah kelas-kelas semacam itu di sepanjang garis perilaku terkait yang secara logis dikelompokkan bersama, dan kemudian mengganti nama kelas-kelas baru untuk mencerminkan apa yang dilakukannya.

Tuan Cochese
sumber
9
Cukup yakin itu SomethingSomethingHelperbukan nama sebenarnya dari kelas. Apakah itu bau kode atau tidak, akan tergantung pada seberapa spesifik kelas helper, karena kelas helper suka Mathbukan bau kode sama sekali.
Robert Harvey
10
@RobertHarvey - Tingkatkan, sebagian besar yang saya lihat telah dinamai SomethingSomethingHelper. Sial, saya sedang melihat kelas yang sekarang bernama HelperMethodsdi <company>.Helpersnamespace. Bagi saya, Helperkelas berada di ember yang sama dengan *Manager.
Telastyn
8
@ Telastyn: Mungkin itu adalah pengalaman, lalu. Saya telah melihat-lihat kelas pembantu dalam proyek saya saat ini (ada beberapa), dan mereka semua memiliki nama yang bermakna. Hanya ada satu yang sufiks dengan Helper, dan saya pikir itu untuk membedakannya dari kelas di .NET Framework memiliki nama yang sama. Saya akan menganggap *Helperdapat diterima jika *itu sesuatu yang bermakna. HelperMethodshanyalah kegagalan imajinasi; setidaknya harus ada ember konseptual tertentu.
Robert Harvey
4
@RobertHarvey - Anda mungkin benar. Semua karier saya menggunakan bahasa modern telah membersihkan rongsokan kereta.
Telastyn
1
Ada bagian dari ini, yang disebut "fungsi pembantu", yang sebenarnya berguna dan pola yang baik. Misalnya, seperangkat garis umum yang seharusnya perlu diulang dalam suatu fungsi - salah satu contoh di mana mereka muncul adalah ketika Anda membutuhkan do..whileloop dalam Python, yang bahasa tidak mendukung (lihat contoh kedua di sini ). Yang lain akan menjadi struktur if / elif /.../ else, tetapi perlu mengulangi case di bagian atas dan bawah. Jika mungkin, mereka harus dibuat lokal untuk fungsi itu, dan umumnya tidak benar-benar disebut "pembantu".
Izkata
5

Helper adalah kelas atau metode tambahan yang tidak berbahaya, asalkan melengkapi komponen eksternal. Ketika melakukan yang sebaliknya, maka itu menunjukkan desain yang buruk karena kode telah dikeluarkan dari otoritasnya, jika ada otoritas sama sekali.

Berikut adalah contoh pembantu yang tidak berbahaya, saya menggunakan metode yang disebut FindRepyang menghitung jumlah nol terkemuka.

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

Metode helper sangat sederhana, tetapi sangat tidak nyaman untuk menyalin-tempel dan kerangka kerja tidak memberikan solusi apa pun.

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;
}

Dan ini adalah contoh pembantu yang buruk:

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; }
    }
}
Leopold Asperger
sumber
-1

Perusahaan saya biasa menggunakan metodologi kelas Basis / kelas Pembantu di mana setiap objek akan memiliki dua kelas. Anda akan memiliki kelas Person yang berisi semua properti dan definisi kelas dan kelas PersonHelper yang berisi semua metode, pernyataan SQL dan Logika yang memanipulasi kelas Person. Ini bekerja dengan baik bagi kami karena semua aplikasi kami menggunakan pernyataan SQL untuk memanipulasi data dan sangat mudah bagi kami untuk menemukan dan memodifikasi pernyataan SQL yang diperlukan.

Kami telah pindah dan sekarang menempatkan semuanya di kelas Person / Base. Kami berhenti menggunakan konvensi penamaan Helper karena kami ingin memiliki lebih sedikit file di proyek kami. Juga, panjang beberapa nama kelas menjadi tidak terkendali. lol.

Bukan contoh yang bagus tetapi Anda mendapatkan ide.

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

Saya tidak mengatakan bahwa menggunakan konvensi penamaan penolong adalah solusi yang sempurna tetapi itu berhasil bagi kami selama beberapa tahun.

Brian
sumber
2
Anda tidak menjelaskan alasannya.
Robert Harvey
2
Ya, saya juga ingin penjelasan itu.
Aaron Hall
@ AaronHall Anggap itu hal yang baik bahwa Anda tidak mengerti pilihan mereka.
Leopold Asperger