Форум программистов, компьютерный форум CyberForum.ru

Возвращение пустого объекта. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Приведение типов? http://www.cyberforum.ru/cpp-beginners/thread377884.html
Подскажите, пожалуйста что происходит. Не понимаю почему такой код работает. .h class Km { private: static const double DIFFERENCE = 1.2; double kilometer; double mili;
C++ Цикл сложный 1. Элементы массива a(8) расположить в том массиве по убыванию. 2. Вычислить произведение матриц b(5*3) и c(3*6). Заранее вам большое спасибо! Программа С. http://www.cyberforum.ru/cpp-beginners/thread377881.html
C++ Семантический вопрос... как называется язык-то?
По моему правильно и разумно оформлять большие куски кода в классы в стиле с++, всё заинкапсулировать, следить за наследованием... Но чувствительные к скорости коды все пишут в стиле си, порой, отказываясь даже от функций в пользу дефайнов... этого явно Страуструп не хотел, а Кернигану и Ричи такая развитая объектная ориентированность в голову не приходила. Так как называть такой язык?
C++ адаптеры
добрый вечер интересно ваше мнение. такие вещи как адаптеры, биндеры позиционируются как шибко быстро работающие. и рекомендуется ими активно пользоваться. Например вместо попыток определить собственную шаблон-функцию сравнения, которая сравнивает входное значение с неким фиксированным значением, рекомендуется юзать биндер, который сделает нам из функции less принимающей 2 параметра для...
C++ Разбить строку http://www.cyberforum.ru/cpp-beginners/thread377849.html
У меня есть строка string^ str в неё записано 6 символов. Как мне разбить эту строку на еще три строки в каждой из которых будут по два символа. тоесть примерно надо получить вот это: str ="123456" str1="12" str2="34" str3="56"
C++ Объясните пожалуйста алгоритм Вычислите сумму с данной точностью е. Используйте указатели на функции как параметры: Сумма от 1 до бесконечности sin n/n Как я понял подставлять вместо n числа от 1 до беск и делить пока выражение не станет < e Я так и сделал,но не могу применить указатели на функцию,как это сделать подскажите #include <conio.h> #include <iostream.h> #include <math.h> int main() { подробнее

Показать сообщение отдельно
Bers
Заблокирован
05.11.2011, 16:39     Возвращение пустого объекта.
Цитата Сообщение от ForEveR Посмотреть сообщение
Это с какой радости?
Закон об инвариантности класса гласит: класс должен сохранять свою работоспособность независимо от того, насколько хорошо вызывающая сторона осведомлена о работе этого класса.

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

Он может отказаться выполнять тупой приказ, но сохранить работоспособность он обязан.

Работоспособность (считай отказоустойчивость класса, а значит и всей системы в этом конкретном узле нити) не должна зависеть от вызывающей стороны.

Работа над ошибками класса - личные трудности класса, и больше никого другого. Это его персональная ответственность.

То есть, класс вернул код ошибки. Что с этим кодом будит делать вызывающая сторона - это её личные трудности. Класс свою работу сделал - сохранил работоспособность системы, и выполнил требуемую от него процедуру согласно своему контракту ( см документацию класса)

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

Получается, что если я попытаюсь работать с таким классом, я вынужден буду знать обо всех возможных ситуациях, которые могут привести к аварии. Все они должны быть отражены в документации класса. А класс за свою собственную работу тип того не отвечает.

Это - нарушение инкапсуляции (что бы пользоваться, мне приходится учить как работает класс, и что может привести к ошибкам), и передергивание ответственности (класс должен облегчать мой труд, принимать на себя ответственность за работу некоторых процедур. А не наоборот - на меня это все сваливать. Зачем мне вообще нужен класс, который будит геммороить меня?)

Короче говоря - пример ущербной архитектуры.

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

Правильный класс кидает исключения тогда, и только тогда, когда произошла исключительная ситуация.

Исключительная ситуация - нештатная ситуация, спрогнозировать которую заранее было невозможно. То есть, это ситуация, которая происходит во_время выполнения процедуры, и предотвратить её ещё до_начала выполнения процедуры класс никак не мог.

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

Ну так вот, правильный класс передаёт эту ответственность своей системе, а не клиентам.
Поясню на примере:

Клиент ---- (Ловушка ---- Исполнитель).

Клиент обращается к ловушке, думая что ловушка - это и есть исполнитель (он ничего не знает о внутренностях)

Ловушка переадресует запрос непосредственно Исполнителю. Поскольку Ловушка-Исполнитель части одной системы, то знание Ловушки об особенностях Исполнителя не нарушают инкапсуляцию. Её просто нету на таком низком уровне.

Таким образом, Ловушку разрабатывают те же люди, которые разрабатывали Исполнителя, и она знает обо всех возможных исключения, которые может выбросить Исполнитель. Задача Ловушки - выловить эти исключения, и предотвратить аварию. Вернуть пошатнувшуюся работу узла обратно в штатный режим.

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

Если Ловушке это не удастся, она может принять решение об аварийной остановке всей системы, и не допустить порчи/потери каких либо ценных данных.
В любом случае, она сделала все что могла зная внутреннее устройство своего Исполнителя.

Во всяком случае, если ловушке не удалось предотвратить аварию полностью, то клиентам этого не удастся тем более. Но так, у системы хотя бы будит шанс.

Ловушки не нужны для ситуаций, когда Исполнитель самостоятельно в состоянии спрогнозировать, сможет ли он со 100% вероятностью выполнить операцию успешно.

Они нужны только в тех ключевых моментах, когда велик риск, что процедура провалится по независящим от Исполнителя причинам (например, new бросила исключение, или физически место на диске закончилось, как раз в тот момент, когда надо записывать, и тп)

Ситуация, когда объект не найден - вообще не является исключительной, а является нормальной частью штатной работы. Городить ловушки тут - излишнее.
 
Текущее время: 15:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru