вторник, 22 октября 2013 г.

Какой код я пишу?

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

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

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

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

Например, если я сделал кнопку которая скрывает часть контролов на форме, то нужно ли обработать ошибки в процессе операции как "откатить изменения"? может и нужно. и это даже можно сделать, но выйдет подороже: ведь появляется копирование и синхронизация, что редко бывает просто. дальше опять ветвление выбора: надо ли отрисовать сделанные изменения, дать возможность подправить их под требования и потом снова сохранить выбранную настройку или надо отбросить все изменения и отрисовать исходный вариант? или может даже оставить в недорисованном виде, что бы пользователь сам закрыл окно и начал сначала? в каждом варианте - новая работа.

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