C ++ Class Design - PullRequest
       13

C ++ Class Design

2 голосов
/ 06 апреля 2011

В настоящее время я занимаюсь разработкой большинства своих классов C ++ со следующей структурой, и мне было интересно, может ли сообщество дать мне несколько советов о том, как улучшить дизайн моего класса, чтобы сделать его более портативным, дружественным и обслуживаемым в будущем.

#include <vector>
#include <iostream>

namespace CompanyName
{
    class Uri;
    class Regex;

    class String
    {
    public:
        String();
        String(const char*);
        String(const String&);

        virtual ~String();

        void trim();
        void erase();
        void remove(const int);
        void remove(const int, const size_t);

        void uppercase();
        void lowercase();

        bool is_null() const;
        bool is_empty() const;

        size_t length() const;

        void append(const String&);            

        bool compare(const String&) const;
        bool compare(const String&, const bool) const;

        void replace(const Regex&, const String&);

        std::vector<String> split(const Regex&) const;

        static const char* to_utf8(const String&);
        static const uint16_t* to_utf16(const String&);
        static const uint32_t* to_utf32(const String&);

        static String from_utf8(const char*);
        static String from_utf16(const uint16_t*);
        static String from_utf32(const uint32_t*);

        static String resource(const Uri&, const int);
        static String resource(const Uri&, const String&);

        String& operator=(String rhs);
        String& operator+(const String& rhs);
        String& operator+=(const String& rhs);

        bool operator==(const String&) const;
        bool operator!=(const String&) const;

        bool operator<(const String&) const;
        bool operator>(const String&) const;

        friend std::ostream& operator<<(std::ostream&, const String&);
        friend std::istream& operator>>(std::istream&, const String&);

        static const String null;
        static const String empty;

    protected:
        struct protected_pimpl;
        protected_pimpl* _protected_pimpl;

    private:
        struct private_pimpl;
        private_pimpl* _private_pimpl;
    };

    //we have to extract the content so as to not expose the UnicodeString.
    inline std::ostream& operator<<(std::ostream& stream, const CompanyName::String& rhs)
    {
        const char* value = String::to_utf8(rhs);
        stream << value;
        delete value;
        return stream;
    }

    inline std::istream& operator>>(std::istream& stream, const CompanyName::String& rhs)
    {
        const char* value = String::to_utf8(rhs);
        stream >> value;
        delete value;
        return stream;
    }
}

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Я бы сказал, что первым, лучшим шагом будет удаление всего, что вам не нужно.

Примите во внимание совет Подвешенные монолиты : классы более ремонтопригодны и «ориентированы на будущее», когда они сокращены до их основных понятий.

Например: почему replace() должна быть функцией-членом? Или to/from_utfX() функции?

1 голос
/ 06 апреля 2011

У вас нет virtual функций-членов, поэтому ваш класс явно не предназначен для полиморфного использования.Таким образом, создание деструктора virtual не является необходимым (и приводит к тому, что у класса появляется ненужная v-таблица), и нет необходимости в protected pimpl.

Также, когда это возможно, всегда предпочитайте свободные функции(при необходимости объявляется friend s) для операторов вместо функций-членов.

...