Pull to refresh
19
0
Send message
Так статья про бизнес-логику и архитектуру, или про юнит-тесты?
Заголовок стати не верный, в нем нет ни единого упоминания про TDD и его влияния на архитектуру.
Мое впечетление — автор хотел написать про бизнес-логику, но про что-либо иное окромя TDD он думать не может (автор — робот?)…
Ваша цель взята из потолка и скорей всего не соответствует действительности.
В ней не учтены потребности людей, которые будут пользоваться чашкой.
В первую очередь нужно отталкиваться от целей людей, которые будут использовать Ваш продукт.
Советую почитать книгу Алана Купера — Психбольница в руках пациентов.
Они пишут: «Им интересны ваши оценки (в институте), даже если вам уже за 30»
Ясно, гугл не для меня, и слава Богу! :)
(а еще я не люблю чувствовать себя глупым, странно, не правда-ли?)
Одно, второе, третье, а что если все вдруг упадет?
Как тогда откат с телефона делать?
Если сайт — халтурка, может быть, но такой подход, на мое мнение, неприменим в серьезных сферах. Я считаю что любые действия программистов должны быть должным образом протестированы, ибо программист не в состоянии увидеть свои ошибки.
Сопутствующий вопрос:
Кто оформляет заказ через форму на сайте (и для чего вообще нужна корзина)?
Мне удобнее позвонить оператору и выяснять, есть ли товар в наличии и тут-же оформить заказ по телефону.
Не понимаю смысл этих корзин и форм на сайте: оформляешь заказ, а тебе (если повезет) перезванивают через день и говорят, что товара нет в наличии.
Может кто объяснит такую ситуацию?
А тестировать кто за Вас будет, пользователи?
Ускорить время загрузки системы можно и проще — все файлы, используемые во время загрузки переложить на начало диска, рядышком и в той последовательности, в которой система при загрузке обращается к этим файлам. Это, к примеру, умеет делать SpeedDisk из пакета Norton Utilities 15.
К сожалению я затрудняюсь выразить логику многопоточого приложения с помощью UML.
Может кто посоветует книгу, или хотябы пример таких диаграмм, где можно было бы выражать логику синхронизации между несколькими потоками?
Насчет макросов это Вы зря, без них иногда просто не обойтись.
>>uintptr_t
Не особо критично, но пожалуй (хотел было заменить на что-то типа size_t, но решил оставить так).

>>Пока вы писали линейный поиск шесть раз, вам в голову не пришло хранить вектор отсортированным?
Тони Хоар впервые произнёс, а Дональд Кнут впоследствии часто повторял известное высказывание:
«Преждевременная оптимизация — это корень всех бед».
Википедия — Оптимизация

>>Поздравляю, вы изобрели read/write lock! Читайте:
Расскажите пожалуйста по-подробней, каким именно образом нужно применить shared_mutex
для решения проблемы с deadlock-ом в приведенном примере?

Я приводил пример с оконной процедурой, возможно получилось не особо внятно…
Функция Subscribe/Unsubscribe вызывается в обработчике оконного сообщения (например по таймеру), и при этом рабочий поток вызывает в цикле функцию Observer::SendMessage(), а реализация MessageHandler() шлет окну сообщение, к примеру даже WM_SETTEXT.

В общем получается что-то вроде этого:
Observer::CDispatcher g_Dispatcher;
DWORD WINAPI WorkingThread(PVOID)
{
    for(;;)
    {
        g_Dispatcher.SendMessage(NULL);
    }
    return 0;
}
...
class CMainDlg : public Observer::CSubscriber
{
private:
    bool m_bSubscribed;
public:
    //Subscriber interface
    virtual void MessageHandler(void* pContext)
    {
        SetWindowText(L"Deadlock test");
    }
    LRESULT OnTimer(UINT, WPARAM, LPARAM, BOOL& bHandled)
    {
        if(m_bSubscribed)
        {
            g_Dispatcher.Unsubscribe(this->GetSubscriberId());
            m_bSubscribed = false;
        }
        else
        {
            g_Dispatcher.Subscribe(this);
            m_bSubscribed = true;
        }
        bHandled = TRUE;
        return 0;
    }
    LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&)
    {
        m_bSubscribed = false;
        ::CreateThread(NULL, 0, WorkingThread, NULL, 0, NULL);
        SetTimer(0, 1);
        ...
    }
...
}

Я ни в коем случае не имел в виду не использовать Signals2, используйте на здоровье!
Если мне понадобится счетчик ссылок, поверье, я смогу его реализовать без использования boost, просто так было удобнее пример писать :)
CreateThread используется лишь в коде для тестирования основных классов.
Данный код служит для показа основной идеи, перед повторным использованием его необходимо осмыслить и переписать заново, а также подстроить под конкретный случай.
Конструктивная критика только приветствуется :)
или даже вот так:
template<typename T, DWORD(__thiscall T::* pMethod)()>
DWORD WINAPI Function(PVOID pParam)
{
    return ((T*)pParam->*pMethod)();
};
...
CreateThread(NULL, 0, Function<MyCalc, &MyCalc::ThrdHandle>, this, 0, NULL);
Наверное это можно было бы реализовать следующим образом, только зачем?..
template<typename T>
struct tThrd
{
    typedef DWORD(__thiscall T::* PMethod)();
    static DWORD WINAPI Function(PVOID pParam)
    {
        return (((tThrd*)pParam)->pThis->*((tThrd*)pParam)->pMethod)();
    };
    T*          pThis;
    PMethod     pMethod;
    HANDLE      Handle;
};

class MyCalc
{
public:
    MyCalc()
    {
        // здесь нет никакой магии :)
        MyThread.pThis = this;
        MyThread.pMethod = &MyCalc::ThrdHandle;
        MyThread.Handle = CreateThread(NULL, 0, MyThread.Function, &MyThread, 0, NULL);
    }
    ~MyCalc()
    {
        WaitForSingleObject(MyThread.Handle, INFINITE);
        CloseHandle(MyThread.Handle);
    }
public:
    DWORD ThrdHandle()
    {
        // что-то сумбурно и долго считаем
        Sleep(10000);
        return 1;
    }
private:
    tThrd<MyCalc> MyThread;
};
>>Сверху пусто, снизу – разъем для наушников, microUSB-порт и отверстие для шнурка.
Разъем там далеко не microUSB, он нестандартный, проприетарный.
По этому приходится носить шнурок с собой то домой, то на работу что очень неудобно.
И если где нибудь потерять такой шнурок, то все, плеер можно выбросить на помойку.
Это существенный минус как на меня.
12 ...
16

Information

Rating
Does not participate
Registered
Activity