Design is about managing and balancing compromises. YAGNI and SOLID do not conflict: the first tells when to add functions, the latter tells how, but they both guide the design process. My answers below each of your specific quotes use principles from both YAGNI and SOLID.
- Three times more difficult to create reusable components as disposable components.
- The repeatable component must be tried out by three different applications before it is general enough to be accepted for reuse.
& EPRS; - Robert Glass' Rules of Three , Facts and Errors in Software Development
Refactoring for reusable components has a key element for first finding the same target in multiple places and then moving. In this context, YAGNI is applied by inserting this goal where necessary, without worrying about possible duplication, instead of adding common or reusable functions (classes and functions).
The best way in the initial design to show when YAGNI is not applied is to define specific requirements. In other words, do some refactoring before writing the code to show that duplication is not just possible, but already exists: it justifies the extra effort.
Yes, I can put all my business logic into GUI code, it is much simpler and faster. This will always be the only graphical interface, and it is unlikely that new requirements will appear.
Is this the only user interface? Is there an initial batch mode planned? Will there ever be a web interface?
What is your test plan and will you test functionality without a graphical interface? This will make it easier for you to work with the graphical interface, since you usually do not want to test external code (for example, platform GUI controls), but instead focus on your project.
It's good that I put both functions of X and included Y in one class. It is so simple why you need to add a new class (i.e. Complexity).
Can you point out a common mistake that should be avoided? Some things are simple enough, like squaring a number ( x * x vs squared(x) ) for an overly simple example, but if you can point out a specific mistake someone made, especially in your project or team, you can show how a common class or function will avoid this in the future.
If in the unlikely event of new requirements my code gets too dry, I can still reorganize the new requirement. So, your argument "What if you need ..." does not count.
The problem here is the "improbability" assumption. Do you agree with this unlikely? If so, you agree with this person. If not, your design idea is not consistent with this person - letting the discrepancy solve the problem, or at least show you where to go next. :)