LINUX.ORG.RU

Вопрос по дизайну

 , ,


0

4

Здравствуйте. Есть вопрос, как правильно задизайнить.

Есть простенький DSV-writer. Хочется путём лёгкой кастомизации превращаться его в CSV, TSV, etc. writer.

И тут у меня появились две соперничающие идеи, как эту кастомизацию сделать.

1.


template <typename Delimiter,
          typename LineTerminator,
          typename Quote,
          typename Comment>
struct Dialect
{
    using DelimiterType = Delimiter;
    using LineTerminatorType = LineTerminator;
    using QuoteType = Quote;
    using CommentType = Comment;

    Dialect() = default;

    Dialect(Delimiter delimiter1, LineTerminator lineTerminator1, Quote quote1, Comment comment1) :
            delimiter(delimiter1), lineTerminator(lineTerminator1), quote(quote1), comment(comment1)
    {}


    Delimiter delimiter;
    LineTerminator lineTerminator;
    Quote quote;
    Comment comment;
};

class Writer
{
    Dialect d;
public:
    Writer(const Dialect& dialect) : d(dialect) {}
    //...
};

const Dialect<char,char,char,char> CSV_Dialect = Dialect<char,char,char,char>(',', '\n', '"', '#');
const Dialect<char,char,char,char> TSV_Dialect = Dialect<char,char,char,char>('\t', '\n', '"', '#');

//.....

int main()
{
    Writer writer(CSV_Dialect);
}

Плюсы подхода - очень просто создать новый диалект. Просто создаём новую переменную типа диалект, задаём нужные нам типы внутри, пихаем туда любые значения, а потом скармливаем это Writer.

2.


template <typename Delimiter,
          typename LineTerminator,
          typename Quote,
          typename Comment>
struct Dialect
{
    using DelimiterType = Delimiter;
    using LineTerminatorType = LineTerminator;
    using QuoteType = Quote;
    using CommentType = Comment;

    Dialect() = default;

    Dialect(Delimiter delimiter1, LineTerminator lineTerminator1, Quote quote1, Comment comment1) :
            delimiter(delimiter1), lineTerminator(lineTerminator1), quote(quote1), comment(comment1)
    {}


    Delimiter delimiter;
    LineTerminator lineTerminator;
    Quote quote;
    Comment comment;
};

template <typename Delimiter,
          typename LineTerminator,
          typename Quote,
          typename Comment>
struct CSV_Dialect : public Dialect<Delimiter,LineTerminator,Quote,Comment>
{
    CSV_Dialect() : Dialect<Delimiter,LineTerminator,Quote,Comment>(',', '\n', '"', '#') {}
};

template <typename Delimiter,
          typename LineTerminator,
          typename Quote,
          typename Comment>
struct TSV_Dialect : public Dialect<Delimiter,LineTerminator,Quote,Comment>
{
    TSV_Dialect() : Dialect<Delimiter,LineTerminator,Quote,Comment>('\t', '\n', '"', '#') {}
};

template <typename Dialect>
class Writer
{
    Dialect d;
    //...
};


//.....

int main()
{
    Writer<CSV_Dialect> writer;
}

Тут проблема в том, что создать новый диалект сложнее.

Если у кого-то есть ещё идеи, как сделать лучше - милости прошу к обсуждению.

eao197

★★

Последнее исправление: zamazan4ik (всего исправлений: 2)

Ответ на: комментарий от RazrFalcon

Сейчас игры уже на JS пишут.

Вот в такое и играй. :D

Ну и «даже сейчас» местами игры очень даже приходится оптимизировать: на тех же консолях, например.

Зачем тебе раст, кстати? GC здорово облегчает жизнь там, где это возможно, а тебя послушать - так это возможно везде.

DarkEld3r ★★★★★
()
Ответ на: комментарий от RazrFalcon

По glibc не скажешь.

memmove достаточно посмотреть и про glibc можно помолчать.

dzidzitop ★★
()
Ответ на: комментарий от anonymous

бессмысленная категоричность - корень всех зол.

dzidzitop ★★
()
Ответ на: комментарий от RazrFalcon

Твой посыл очень простой - «где-то слышал про vtable (вкупе со спекулятивными оптимизациями JIT на Java) и горожу мудрости о том, что виртуальные вызовы почти бесплатные».

dzidzitop ★★
()
Ответ на: комментарий от RazrFalcon

Вашу либу на гитхабе я видел. Мне этого достаточно.

Сомневаюсь что ты хоть один элемент публичного API из этой либы там осознанно увидел и сможешь процитировать. Но тебе этого достаточно.

dzidzitop ★★
()
Ответ на: комментарий от anonymous

О тактах и наносекундах говорится в контексте стоимости виртуального вызова в живом коде, а не о парсере-однодневке CSV.

К тому же, эти наносекунды неожиданно так становятся потерянными микросекундами при неудачном стечении обстоятельств на бесплатном виртуальном вызове.

dzidzitop ★★
()
Последнее исправление: dzidzitop (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.