Difference between revisions of "Programming/Principles"
Line 1: | Line 1: | ||
=Principles= | =Principles= | ||
==Make Interfaces Easy to Use Correctly and Hard to Use Incorrectly== | |||
Scott Meyers in '''[H10]''': | |||
<blockquote> | |||
One of the most common tasks in software development is interface specification. Interfaces occur at the highest level of abstraction (user interfaces), at the lowest (function interfaces), and at levels in between (class interfaces, library interfaces, etc.). Regardless of whether you work with end users to specify how they'll interact with a system, collaborate with developers to specify an API, or declare functions private to a class, interface design is an important part of your job. If you do it well, your interfaces will be a pleasure to use and will boost others' productivity. If you do it poorly, your interfaces will be a source of frustration and errors. | |||
Good interfaces are: | |||
* Easy to use correctly | |||
<blockquote> | |||
People using a well-designed interface almost always use the interface correctly, because that's the path of least resistance. In a GUI, they almost always click on the right icon, button, or menu entry, because it's the obvious and easy thing to do. In an API, they almost always pass the correct parameters with the correct values because that's what's most natural. With interfaces that are easy to use correctly, things just work. | |||
</blockquote> | |||
* Hard to use incorrectly | |||
<blockquote> | |||
Good interfaces anticipate mistakes people might make, and make them difficult—ideally, impossible—to commit. A GUI might disable or remove commands that make no sense in the current context, for example, or an API might eliminate argument-ordering problems by allowing parameters to be passed in any order. | |||
</blockquote> | |||
A good way to design interfaces that are easy to use correctly is to exercise them before they exist. | |||
<blockquote> | |||
==Easier to change (ETC)== | ==Easier to change (ETC)== | ||
Line 49: | Line 72: | ||
=Bibliography= | =Bibliography= | ||
* '''[H10]''' Kevin Henney. ''97 Things Every Programmer Should Know''. O'Reilly, 2010. | |||
* '''[M97]''' Bertrand Meyer. ''Object-Oriented Software Construction'', second edition. Prentice Hall, 1997. | * '''[M97]''' Bertrand Meyer. ''Object-Oriented Software Construction'', second edition. Prentice Hall, 1997. | ||
* '''[TH20]''' David Thomas, Andrew Hunt. ''The Pragmatic Programmer'', 20th Anniversary Edition. Addison–Wesley, 2020. | * '''[TH20]''' David Thomas, Andrew Hunt. ''The Pragmatic Programmer'', 20th Anniversary Edition. Addison–Wesley, 2020. |
Revision as of 10:24, 11 July 2021
Principles
Make Interfaces Easy to Use Correctly and Hard to Use Incorrectly
Scott Meyers in [H10]:
One of the most common tasks in software development is interface specification. Interfaces occur at the highest level of abstraction (user interfaces), at the lowest (function interfaces), and at levels in between (class interfaces, library interfaces, etc.). Regardless of whether you work with end users to specify how they'll interact with a system, collaborate with developers to specify an API, or declare functions private to a class, interface design is an important part of your job. If you do it well, your interfaces will be a pleasure to use and will boost others' productivity. If you do it poorly, your interfaces will be a source of frustration and errors.
Good interfaces are:
- Easy to use correctly
People using a well-designed interface almost always use the interface correctly, because that's the path of least resistance. In a GUI, they almost always click on the right icon, button, or menu entry, because it's the obvious and easy thing to do. In an API, they almost always pass the correct parameters with the correct values because that's what's most natural. With interfaces that are easy to use correctly, things just work.
- Hard to use incorrectly
Good interfaces anticipate mistakes people might make, and make them difficult—ideally, impossible—to commit. A GUI might disable or remove commands that make no sense in the current context, for example, or an API might eliminate argument-ordering problems by allowing parameters to be passed in any order.
A good way to design interfaces that are easy to use correctly is to exercise them before they exist.
Easier to change (ETC)
Good Design Is Easier to Change Than Bad Design.
A thing is well designed if it adapts to the people who use it. For code, that means it must adapt by changing. So we believe in the ETC principle: Easier to Change. ETC. That's it.
As far as we can tell, every design principle out there is a special case of ETC.
Why is decoupling good? Because by isolating concerns we make each easier to change. ETC.
Why is the single responsibility principle useful? Because a change in requirements is mirrored by a change in just one module. ETC.
Why is naming important? Because good names make code easier to read, and you have to read it to change it. ETC!
ETC Is a Value, Not a Rule.
Values are things that help you make decisions: should I do this, or that? When it comes to thinking about software, ETC is a guide, helping you choose between paths. Just like all your other values, it should be floating just behind your conscious thought, subtly nudging you in the right direction. [TH20]
Meyer's Five Rules
Linguistic Modular Units principle
Modules must correspond to syntactic units in the language used.
Self-Documentation principle
The designer of a module should strive to make all information about the module part of the module itself.
Uniform Access principle
All services offered by a module should be available through a uniform notation, which does not betray whether they are implemented through storage or through computation.
Open-Closed principle
Modules should be both open and closed.
Bibliography
- [H10] Kevin Henney. 97 Things Every Programmer Should Know. O'Reilly, 2010.
- [M97] Bertrand Meyer. Object-Oriented Software Construction, second edition. Prentice Hall, 1997.
- [TH20] David Thomas, Andrew Hunt. The Pragmatic Programmer, 20th Anniversary Edition. Addison–Wesley, 2020.