SORU
5 Temmuz 2010, PAZARTESİ


Ne kadar güçlü bir şekilde yazılan bir dil.

Hadi bir API yazıyorum ki, benim işlevlerinden biri bir kanal temsil eder, ve sadece hiç değerleri 0 ile 15 arasında olacak bir parametre alır. Bu şekilde yazabilirim:

void Func(unsigned char channel)
{
    if(channel < 0 || channel > 15)
    { // throw some exception }
    // do something
}

Ya ben C türü kesin belirlenmiş bir dil olma avantajını, ve kendimi bir tür yapın

class CChannel
{
public:
    CChannel(unsigned char value) : m_Value(value)
    {
        if(channel < 0 || channel > 15)
        { // throw some exception }
    }
    operator unsigned char() { return m_Value; }
private:
    unsigned char m_Value;
}

Benim görevim, şimdi bu hale gelir:

void Func(const CChannel &channel)
{
    // No input checking required
    // do something
}

Ama bu toplam overkill mi? Ben kendi belgeleri ve garanti söylediği gibi, ama böyle bir nesne, bırak tüm ek yazarak yapım ve yıkım ödemeye değer mi? Bana yorum ve alternatifler bildirin lütfen.

CEVAP
5 Temmuz 2010, PAZARTESİ


Eğer bu basit yaklaşım çok genelleme istiyorsan daha fazla yararlanmak yerine, özel bir şey için özel olabilir. O zaman soru, "bu özel bir şey için tamamen yeni bir sınıf yapmak gerekir?" ama "benim programları kullanmalıyım?"; ikincisi her zaman evet. Ve gereçleri her zaman faydalıdır.

Bu yüzden bir şey gibi:

template <typename T>
void check_range(const T& pX, const T& pMin, const T& pMax)
{
    if (pX < pMin || pX > pMax)
        throw std::out_of_range("check_range failed"); // or something else
}

Şimdi zaten kontrol aralıkları için bu güzel programı var. Kodunuzu, hatta kanal türü olmadan, zaten temizleyici kullanılarak yapılabilir. Daha ileri gitmek

template <typename T, T Min, T Max>
class ranged_value
{
public:
    typedef T value_type;

    static const value_type minimum = Min;
    static const value_type maximum = Max;

    ranged_value(const value_type& pValue = value_type()) :
    mValue(pValue)
    {
        check_range(mValue, minimum, maximum);
    }

    const value_type& value(void) const
    {
        return mValue;
    }

    // arguably dangerous
    operator const value_type&(void) const
    {
        return mValue;
    }

private:
    value_type mValue;
};

Şimdi güzel bir programı var, ve sadece bunu yapabilirsiniz:

typedef ranged_value<unsigned char, 0, 15> channel;

void foo(const channel& pChannel);

Ve yeniden kullanılabilen diğer senaryolarda. Sadece "checked_ranges.hpp" Bir dosya koy ve ihtiyacınız olduğunda kullanın. Asla kötü soyutlamalar yapmak, ve etrafında yardımcı olması zararlı değil.

Ayrıca, asla yükü düşün. Bir sınıf oluşturma basit zaten yaparsın aynı kod çalıştıran oluşur. Ayrıca, temiz kod başka bir şey tercih edilir; performans son bir husustur. İşiniz bittiğinde, daha sonra yavaş bölümleri ölçmek için bir profiler (sanırım) alabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amazon Web Services

    Amazon Web S

    8 NİSAN 2009
  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • ODN

    ODN

    26 Kasım 2006