Hi,
A great initiative, thank you!

I am generally in favor of this proposal but just want to give a cautionary
tale. It's a bit off-topic but important.
Given that there is no actual enforcing mechanism for the documentation
typehints, some of them have actually drifted from reality. I caused a UBN
bug once by relying on the documentation for the type of a variable. So my
request is to avoid mass migration of documentation type hints to php type
declaration.

Best

Am So., 30. Okt. 2022 um 14:02 Uhr schrieb Daniel Kinzler <
dkinz...@wikimedia.org>:

> Thank you for suggesting this!
> I agree that type declaration is preferable to type documentation, and
> that type documentation is often redundant if type declaration is present.
>
> However, we can't always use type declarations. For instance, union types
> are quite useful, since PHP doesn't have method overloading. And union type
> declarations will only become available in PHP 8. So we'll have a mix of
> declared and un-declared parameters and fields for a while. I think we
> should still require type documentation if there is no type declaration -
> and of course, if a method has any @param tags, it needs to have all of
> them.
>
> Also there is the notable exception of the array type. Saying that
> something is an array is generally insufficient, we should say at least
> whether it's a list or an associative array, and document the type of the
> array elements or and/or well-known keys.
> And we should be careful that we don't end up discouraging documentation
> of the meaning of a parameter. The barrier to adding some explanation of
> the meaning of a parameter is lower if there is already a @param string
> $name line. If I'd first have to create a doc block, I may just not add the
> documentation at all. We should still encourage having doc blocks in all
> but the most trivial cases (simple constructors, getters and setters
> probably don't need one).
>
> -- daniel
>
> PS: I'm not sure I like constructor argument property promotion... For
> very simple value objects that might be nice, but generally, I fear it will
> make it harder to see all fields declared on an object.
> Am 28.10.2022 um 16:03 schrieb Lucas Werkmeister:
>
> Hi all!
>
> In my opinion, MediaWiki’s PHPCS ruleset feels largely rooted in an older
> version of PHP, where static type declarations (formerly known as “type
> hints”) did not exist. As we move towards more modern code, I think some
> rules should be relaxed, and others adjusted. More specifically, I’d like
> to know if most people agree with the following propositions and conclusion:
>
> Proposition 1: *Some code is sufficiently documented by names and types*,
> and does not require additional documentation. Cases where additional
> documentation is required do certainly exist, but they can only be
> identified by human reviewers, not by automated tools.
>
> You can see this in our existing code wherever a doc comment specifies
> only a type (with @var, @param, or @return), but no additional text. For
> example, in CreditsAction
> <https://gerrit.wikimedia.org/g/mediawiki/core/+/de752f45af/includes/actions/CreditsAction.php>,
> nobody needs to be told that the LinkRenderer will be used to render
> links, or that the UserFactory creates User objects:
>
> class CreditsAction extends FormlessAction {
>
>   /** @var LinkRenderer */
>
>   private $linkRenderer;
>
>   /** @var UserFactory */
>   private $userFactory;
>
> Likewise, it’s not necessary to explain in great detail that the string
> returned by LinksTable::getTableName()
> <https://gerrit.wikimedia.org/g/mediawiki/core/+/de752f45af/includes/deferred/LinksUpdate/LinksTable.php#175>
> is the table name, that the $actor parameter of ActorCache::remove(
> UserIdentity $actor )
> <https://gerrit.wikimedia.org/g/mediawiki/core/+/de752f45af/includes/user/ActorCache.php#103>
> represents the actor to remove from the cache, or what the meaning of the 
> Message
> $m and returned MessageValue are in Message\Converter::convertMessage()
> <https://gerrit.wikimedia.org/g/mediawiki/core/+/de752f45af/includes/Message/Converter.php#48>
> :
>
> /**
>
> * Convert a Message to a MessageValue
>
> * @param Message $m
>
> * @return MessageValue
>
> */
> public function convertMessage( Message $m ) {
>
> (I want to clarify that in this last example I’m only talking about the
> @param and @return tags that already don’t have any prose text. While the
> method comment “Convert a Message to a MessageValue” might also be
> considered redundant, I think this would be more contentious, and I’m not
> advocating for removing that today.)
>
> Proposition 2: *Adding types as static types is generally preferable.*
> Unlike doc comments, static types are checked at runtime and thus
> guaranteed to be correct (as long as the code runs at all); the small
> runtime cost should be partially offset by performance improvements in
> newer PHP versions, and otherwise considered to be worth it. New code
> should generally include static types where possible, and existing code may
> have static types added as part of other work on it. I believe this
> describes our current development practice as MediaWiki developers.
>
> Note that some older MediaWiki classes are considered unsuitable for
> static types, and should only be used in comments; this is expected to help
> in a future migration away from these classes (see T240307#6191788
> <https://phabricator.wikimedia.org/T240307#6191788>).
>
> Proposition 3: *Where types can be losslessly represented as PHP static
> types, types in doc comments are unnecessary.* When doc comments are
> considered necessary for actual documentation beyond types, then the type
> is generally still included (and Phan will check that it matches the static
> type), but when no further documentation is needed (see proposition 1
> above), then the @var, @param, etc. doc comment can be omitted.
>
> Note that depending on the PHP version, not all types can be losslessly
> represented as PHP static types yet (e.g. union types and mixed both need
> to wait for PHP 8.0, null and false for PHP 8.2); in such cases, doc
> comments can remain necessary.
>
> Conclusion: *We should update our PHPCS ruleset to require fewer doc
> comments.* Exact rules are probably to be decided, depending on how much
> work we’re willing to put into the sniff implementations (e.g. is it
> feasible to require /** @param */ doc comments only if a parameter has no
> static type?), but generally, I argue that we want code such as the
> following to be allowed by our standard PHPCS ruleset:
>
> class CreditsAction extends FormlessAction {
>
>   private LinkRenderer $linkRenderer;
>
>   private UserFactory $userFactory;
>
> /** Convert a Message to a MessageValue */
>
> public function convertMessage( Message $m ): MessageValue {
>
> When doc comments are still necessary or at least beneficial because the
> type alone isn’t enough information, it’s up to humans to decide this while
> writing the code or point it out during code review.
>
> What do people think about this? :)
>
> PS: In PHP 8, we could abbreviate some of this code even more using
> constructor property promotion:
>
> class CreditsAction extends FormlessAction {
>
>   public function __construct(
>
>      Page $page,
>
>      IContextSource $context,
>
>      private LinkRenderer $linkRenderer,
>
>      private UserFactory $userFactory
>
>   ) {
>
>      parent::__construct( $page, $context );
>
>   }
>
> (Again, I’m not saying that all code should look like this – but I think
> we have plenty of existing code that effectively carries no additional
> information in its documentation, and which could be converted into this
> form without losing anything.)
>
> Cheers,
> Lucas
>
> --
> Lucas Werkmeister (he/er)
> Software Engineer
>
> Wikimedia Deutschland e. V. | Tempelhofer Ufer 23-24 | 10963 Berlin
> Phone: +49 (0)30-577 11 62-0
> https://wikimedia.de
>
> Imagine a world in which every single human being can freely share in the
> sum of all knowledge. Help us to achieve our vision!
> https://spenden.wikimedia.de
>
> Wikimedia Deutschland - Gesellschaft zur Förderung Freien Wissens e. V.
> Eingetragen im Vereinsregister des Amtsgerichts Berlin-Charlottenburg unter
> der Nummer 23855 B. Als gemeinnützig anerkannt durch das Finanzamt für
> Körperschaften I Berlin, Steuernummer 27/029/42207.
>
> _______________________________________________
> Wikitech-l mailing list -- wikitech-l@lists.wikimedia.org
> To unsubscribe send an email to 
> wikitech-l-leave@lists.wikimedia.orghttps://lists.wikimedia.org/postorius/lists/wikitech-l.lists.wikimedia.org/
>
> --
> Daniel Kinzler
> Principal Software Engineer, Platform Engineering
> Wikimedia Foundation
>
> _______________________________________________
> Wikitech-l mailing list -- wikitech-l@lists.wikimedia.org
> To unsubscribe send an email to wikitech-l-le...@lists.wikimedia.org
> https://lists.wikimedia.org/postorius/lists/wikitech-l.lists.wikimedia.org/



-- 
Amir (he/him)
_______________________________________________
Wikitech-l mailing list -- wikitech-l@lists.wikimedia.org
To unsubscribe send an email to wikitech-l-le...@lists.wikimedia.org
https://lists.wikimedia.org/postorius/lists/wikitech-l.lists.wikimedia.org/

Reply via email to