I would like to hear how someone can check code for such and other code smells.
The first thing I would say is, if you are spending your time worrying about minor interface design details like these, you must have too much time on your hands.
Unless you are writing an interface for a module that is going to be reused by 100s or 1000s of people for the next decade or so, the difference such small, academic refactoring of this sort will make in the overall scheme of things are negligible.
The reality is that most classes defined by most people rarely get reused beyond the project that they are defined for. And these days, far more sins are committed in the name of methodology purity (mostly OO purity, but also FP purity; AO purity etc.), than were ever committed in the name of premature optimisation.
Is it really only possible with experience?
Yes. But it is possible to simulate some of that experience to some degree -- iff you can justify the effort.
Ie. If there is very good reason for you to realistically believe that the interface that you are designing will be reused sufficiently widely to justify the time and effort you put into it.
The way to do that, is to try and use the interface in at least two substantially different (sub)projects. That is, define the interface on paper. If possible, mock up that interface in a "compilable" module that does nothing beyond checking arguments and returning "realistic" values.
Then get a couple of people -- preferably people other than the interface designer -- to independently -- of each other and the designer -- prototype calling applications using the defined interface. With reasonably experienced people, this process shouldn't take more than 2 or 3 days. If it does, it probably means that it has found a problem.
Or is there a way to work down a kind of checklist?
Once the two prototypes are put together, get all three people in a room and go through the way the interface has been used in those prototypes. Contrasting how two people independently try to use the interface; and then contrasting those with how the designer thought it would be used. This process will usually do far more to highlight inconsistencies, omissions and redundancies in an interface design than any amount of running check lists, or other academical, criteria-driven soul searching done in isolation of actual real-use calling code.
Interface design is all about the 'user experience'. Don't read that as the overused, over-hyped marketing phrase. In this case, the users are the programmers that will use the interface; and it isn't about warm and fuzzy "feelings", it is about the interface lending itself to the use by the calling code, without forcing that code into awkward, repetitive or inefficient hoops.
The interface should be designed for the ease of learning and programming of the calling code; not the personal philosophies of the designers or the ease of internal implementation.
Remember, the neo-classical adage that programmer time is more valuable than cpu time isn't true, if the time saved by the programmer that does the internal implementation, is at the expense of every programmer that has to use that implementation.
Nor, if it makes the end users of every application written using it, sit around waiting, while it burns unnecessary cycles and power.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".