1 Востаннє редагувалося incred (08.09.2013 13:40:44)

Тема: Як зберегти семантичну інкапсуляцію?

Припустимо, що в мене є клас, в ньому кілька методів-фільтрів, що перевіряють на помилки данні цього ж класу.
Один з них виконує "грубу" перевірку, тобто знаходить щось елементарне, з яким далі працювати неможливо(тому і перевіряємо).
Він МОЖЕ викликатися як самостійний метод класу, тобто коли детальна перевірка є недоцільною.
Він МАЄ викликатися кожного разу перед "спеціалізованими" методами(окрім нього у нас, як я вже казав, є ще  деякі методи, що перевіряють прискіпливіше, та все ж вони не схильні працювати самостійно: вони виконують перевірку, яка, звичайно, як така - правильна, але без "грубої" ніякого сенсу не має).

Є 3 варіанти подальшого розвитку подій:

а) Внести в документацію опис проблеми( - не викликати такі-то методи без "грубого")
Недоліки:
    0. Це дає дозівл ІНШИМ "філософствувати" над роботою моїх методів, тобто я розкриваю інформацію про
        алгоритм. Користувач не повинен бути обтяженим зайвою інформацією: це завжди корисно, програма
        стає простішою.
    1. Ніхто не застрахований від тупих користувачів.
    2. Це незручно.

б) Запхнути виклик "грубого" методу у кожний інший.
Недоліки:
    1. Уявіть собі каскад викликів "ніжних" методів(можливо й таке). Кожний буде змушений викликати "грубий"
       фільтр. На який таке треба?

Прихований текст

(Хочу зазначити: усі методи є незалежними один від одного(і, звичайно, є залежними від "грубого").)

    2. І знову ж тупий користувач.

в) Вліпити код з "грубого" метода в кожний інший.
    1. То саме
    2. Це по-дибільному.
    3. Це тричі по-дибільному - жодна із вимог не виконується.
Нагадаю умови: код має бути оптимальним і приховувати всі секрети.

з.ю.
Серед трьох, я б обрав перший.

2 Востаннє редагувалося koala (08.09.2013 14:22:50)

Re: Як зберегти семантичну інкапсуляцію?

Це суттєво залежить від предметної області і поставленої мети. Одразу зауважу, що методи б) і в) ідентичні з точністю до рівня декомпозиції - яка різниця, вкладається чи викликається метод? Проголосіть його inline, зрештою.
Що ж до суті питання, то все можна оптимізувати:
а) створити ієрархію класів відносно роботи валідаторів; наприклад, класи "сира матриця", "матриця", "ліва нижня матриця" і "трикутна матриця" очевидно контролюють правильність вводу (сира матриця -> матриця), нулі в правому горішньому трикутнику (матриця -> ліва нижня матриця) і в правому нижньому (ліва нижня матриця -> діагональна матриця). Тоді документація буде очевидно пов'язана із роботою системи.
б), в) кешувати результат роботи валідаторів; так, виклик функції, що може зашкодити цілісності даних, може, крім всього іншого, встановлювати ознаку "неперевірено", а валідатор може першою дією перевіряти цю ознаку і повертати "ок", якщо вона не встановлена.

Подякували: incred, Replace2

3 Востаннє редагувалося incred (08.09.2013 14:51:28)

Re: Як зберегти семантичну інкапсуляцію?

навіть не знаю, з якого питання почати.............
наскільки я зрозумів, то щодо кешування, можна створити якийсь перемикач(на кшталт isTestedByTheFirst).
Але якщо струтура програми буде складнішою, то невже треба витрачати цілий клас на то, і знову ж таки, наявність у класі чогось подібного зробить його менш абстрагованим.

Щодо матриць, нічого не зрозумів *SORRY*.

4

Re: Як зберегти семантичну інкапсуляцію?

Ще раз: це залежить від предметної області. Доки не скажете, яка у вас предметна область, жодні приклади не матимуть сенсу.

Подякували: Replace1

5 Востаннє редагувалося incred (08.09.2013 15:33:57)

Re: Як зберегти семантичну інкапсуляцію?

Це фрагмент програми, що робить звіт. Він має перевіряти допустимість введеної інформації.
Звичайно, тут можна довго і не мудрувати, оскільки НУ ДУЖЕ великих модифікацій програма не зазнає, але я хотів би знати шо із цим робити, якщо дійсно доведеться зіткнутися з такою проблемою.
Моя ціль: заголовок теми.

6

Re: Як зберегти семантичну інкапсуляцію?

Ти ба, а я подумав, що предметна область - надзвукові літаки...
Не хочете казати - не треба, справа ваша. Тільки нащо тоді на форумі теми створювати...

7 Востаннє редагувалося incred (08.09.2013 15:55:12)

Re: Як зберегти семантичну інкапсуляцію?

Чому не хочте казати? Я ж і кажу, ця программа створює звіти компанії, що займається здачами приміщень в оренду.
Користувач - бухгалтер.
Рівень відповідальності - середній.

Просто я думав, тої інформації достатньо.

8

Re: Як зберегти семантичну інкапсуляцію?

incred, з якими глобальними бібліотеками програма написана?
Якщо доступний механізм сигналів/слотів (або повідомлень вінапі), то можна у грубому методі реалізувати генератор нової події (сигналу, повідомлення), яке переадресуватиметься іншим методам, коли те необхідно. У той же час доступ до спец-методів обмежити (скажімо, protected їм поставити), щоб забезпечити 100% їх виклик лише з "грубого" методу.

9 Востаннє редагувалося incred (08.09.2013 17:31:32)

Re: Як зберегти семантичну інкапсуляцію?

2 варіанти: або мене не розуміють, або я не розумію.
Грубий метод нікого не має запускати, і сам, що робити далі, він не вирішує.
Він є лише необхідною умовою правильного результату інших методів.
У них помилок виникнути не може. Просто інформація, яку спец методи будуть перевіряти, буде вже від початку неправильною.
Проблема в тому, що грубий метод може сам викликатися, а інші передбачають, що перед ними уже був викликаний грубий, і тому компілятор мені нічого не скаже, якщо я, не викликаючи грубого, викличу спец метод.
А треба б було(або треба винайти інший спосіб).

Чому я так піклуюся про користувачів цього класу, бо насправді думаю про то, якби я писав бібліотеку із набагато ширшими можливостями. Питання не в тому, наскільки важлива програма. Приорітетним є спосіб, яким я заставлю виконуватися один метод перед другим без проблем.

Можливо, спосіб із кешуванням дійсно буде оптимальним. На початку кожного спец методу перевіряти, чи викликався грубий, чи викликався якийсь інший спец.

Подякували: koala1

10

Re: Як зберегти семантичну інкапсуляцію?

Тоді флаги/маски. Іншого без наочного коду не бачу.