Хороший интерфейс: легко использовать правильно, сложно использовать неправильно
(В оригинале - Make Interfaces Easy to Use Correctly and Hard to Use Incorrectly)
Самая часто встречающаяся в разработке ПО задача – это определение интерфейсов. Интерфейсы могут быть на самом высоком уровне абстракции (пользовательский интерфейс), на самом низком (интерфейс функций) и на остальных уровнях между ними (интерфейс классов, интерфейс библиотек и т.п.). Независимо от того, общаетесь ли вы с пользователями для определения того, как они будут взаимодействовать с системой, или же с программистами, определяя интерфейс классов, проектирование интерфейса – важная часть работы. Если вы сделаете ее хорошо, ваш интерфейс будет удобно использовать, и он будет повышать производительность других людей. Плохо сделанный интерфейс будет служить источником раздражения и ошибок.
Свойства хорошего интерфейса:
- Легко использовать правильно. Люди, использующие хорошо спроектированный интерфейс, почти всегда используют его правильно, потому что так проще. В GUI они почти всегда кликают по правильной иконке, кнопке или меню, потому что это для них очевидно. В функциональном API они практически всегда передают корректные значения в корректные функции, потому что именно так делать наиболее естественно. С интерфейсами, которые легко использовать, все просто работает само собой.
- Сложно использовать неправильно. Хорошие интерфейсы предвидят возможные ошибки и делают так, чтобы ошибки было сложно (а лучше – если вообще невозможно) допустить. GUI может запрещать или убирать команды, не имеющие смысла в данном контексте, или же API может сразу решить проблему неправильного порядка параметров, разрешив их передачу в произвольном порядке.
Хороший способ разработать удобный в использовании интерфейс – это изучить его до его создания. Постройте модель GUI, на доске маркерами или же на столе карточками, и попробуйте поиграть с моделью до того, как она будет реализована в коде. Напишите вызовы API до того, как будут определены функции. Пройдитесь по основным примерам использования и уточните желаемое поведение интерфейса. На что можно будет нажать? Что можно будет передать? Простые в использовании интерфейсы выглядят естественно, поскольку дают возможность вам делать то, что вам нужно делать. У вас гораздо больше шансов сделать такой интерфейс, если вы будете на него смотреть глазами пользователя. (Это, кстати, одна из сильных сторон подхода «сначала тестируй, потом кодируй»)
Чтобы сделать интерфейс, который будет сложно использовать неправильно, нужно две вещи. Первое – вы должны предугадать ошибки пользователей и найти способы их предотвратить. Второе – вы должны отслеживать случаи неправильного использования предыдущих версий интерфейса и менять его (да-да, менять интерфейс!) так, чтобы предотвращать подобные ошибки в дальнейшем. Лучший вариант предотвращения неправильного использования – сделать его невозможным. Если пользователь настойчиво пытается отменить неотменяемую операцию, постарайтесь сделать ее отменяемой. Если пользователь часто передает неправильный параметр – постарайтесь сделать так, чтобы вариант пользователя имел смысл и мог быть корректно принят.
И главное – помните, что интерфейсы нужны для удобства тех, кто эти интерфейсы использует, а не тех, кто их разрабатывает.
Автор оригинала - Scott Meyers