Daniel Kinzler <dkinz...@wikimedia.org> writes:
> 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.

+1, there is also \stdClass which we use in a few places. I believe IDEs will 
attempt to create placeholders for all
parameters as well, if you start documenting a single one.

> 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).

I agree with this as well.

Kosta

>
> – 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, 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() is the
>  table name, that the $actor parameter of ActorCache::remove( UserIdentity 
> $actor ) represents the actor to remove
>  from the cache, or what the meaning of the Message $m and returned 
> MessageValue are in
>  Message\Converter::convertMessage():
>
>  /**
>
>  * 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).
>
>  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-le...@lists.wikimedia.org
> <https://lists.wikimedia.org/postorius/lists/wikitech-l.lists.wikimedia.org/>
_______________________________________________
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