logo
logo
Нужен совет. [Dervish 05/03/2015 03:06]
Я помаленьку продвигаюсь с новой версией AbilityCash. В новой версии будет новый формат файла (старые данные перенесутся), данные будут храниться в SQLite - базе данных, ставшей фактическим стандартом для мобильных устройств и широко применяющейся на десктопах. Если файл данных не закрыт паролем, его можно будет открыть любой программой, поддерживающей SQLite, например, DB Browser for SQLite. Защищенный паролем файл не сможет открыть никто, не знающий пароль. Даже я (больше не смогу восстанавливать пароли). Забытый пароль будет означать невозможность открыть данные.
 
Еще из новостей: если сейчас валюты можно создавать максимум с 4-мя знаками после запятой, то в новой версии можно будет создать валюту максимум с 15-ю знаками после запятой. Это пригодится пользователям, которые учитывают паи ПИФ (если такие еще есть в условиях кризиса). Пользователи, владеющие Bitcoin тоже должны оценить это нововведение.
 
И вот возникло у меня желание заодно сделать еще одну переделку. Однако, нет уверенности, что такая переделка пойдет на пользу. Прежде чем делать, хочу предложить обсудить нововведение.
 
Итак, диалог ввода/редактирования операции. Допустим, мы вводим операцию перевода с одного счета на другой в разных валютах. В этом случае AbilityCash предложит нам заполнить три поля:
- Сумма списания
- Сумма зачисления
- Курс пересчета
 
При этом, там еще будет переключатель (radio-button), который будет делать одно из этих полей недоступным для ввода. Как бы понятно, для чего там стоит этот переключатель: с его помощью выбирается поле, которое будет автоматически вычисляться по мере изменения одного из других полей. Это решение функционально полное, однако оно не нравится тем, что (а) совершенно не очевидно поведение программы и ее реакция на переключатели, (б) ввод операции перевода занимает больше времени, чем могло бы потому что нужно переключаться между клавиатурой и мышкой чтоб выбрать вычисляемое поле.
 
Итак, идея довольно проста: убрать переключатель и сделать все три поля для ввода всегда доступными для ввода. Тогда при изменении любого поля программа будет пересчитывать следующее поле, а при изменении поля "Курс пересчета", будет пересчитываться поле "Сумма зачисления".
 
Если в базе данных забит курс между, скажем, рублем и долларом (например, 63 рубля за доллар), то при добавлении новой операции, как только мы выберем два счета в рублях и долларах, в диалоге тут же появится:
- Сумма списания: 0,00 USD
- Сумма зачисления: 0,00 RUR
- Курс пересчета: 63,00 RUR за 1 USD
 
Далее, вводим в первое поле 100 и получаем:
- Сумма списания: 100,00 USD
- Сумма зачисления: 6300,00 RUR
- Курс пересчета: 63,00 RUR за 1 USD
 
Допустим, сумма зачисления не совпадает с той, которая посчиталась по курсу базы данных, и мы исправляем 6300 RUR в 6400:
- Сумма списания: 100,00 USD
- Сумма зачисления: 6400,00 RUR
- Курс пересчета: 64,00 RUR за 1 USD
 
Ну а если исправить курс пересчета, написать, скажем 65, то получим:
- Сумма списания: 98,46 USD
- Сумма зачисления: 6400,00 RUR
- Курс пересчета: 65,00 RUR за 1 USD
 
Вроде бы все получается довольно удобно. За исключением одной единственной ситуации: когда у пользователя есть сумма списания и курс пересчета. В этом случае пользователю придется вначале ввести курс пересчета и только потом сумму списания. Только в этом случае программа верно сможет посчитать сумму зачисления. Хотя, есть еще один вариант: вначале ввести сумму списания, а потом в поле суммы зачисления ввести выражение: (сумма списания / курс пересчета).
 
Такое поведение программы выглядит более ожидаемым пользователями, в отличие от существующего. Однако, вот проблема из предыдущего абзаца заставила меня сомневаться в удачности такого решения. Буду признателен за мнения по этому вопросу. Может быть, есть какой-то другой вариант?
 
Да, оговорюсь сразу: делать еще одну настройку в программе "новое/старое поведение диалога редактирования операции" я совсем не хочу: там и так код довольно тяжелый, все усложнения ни к чему, либо все оставлю как есть, либо просто внедрю новое решение.
 
Спасибо.