Hi all!

Per yesterday's TechCom meeting, the last call ended without any concerns being
raised. If you work on extensions or MediaWiki core, please read through the
changes outlined below, and have a look at the policy page at
<https://www.mediawiki.org/wiki/Stable_interface_policy>.

Thanks!

Am 28.02.20 um 11:38 schrieb Daniel Kinzler:
> Hi all!
> 
> TL;DR: A new policy defining stable interfaces for use by extensions, and the
> deprecation process that must be followed when changing such stable 
> interfaces,
> is now in the Last Call period. If no concerns remain unaddressed by March 11,
> the new policy will be adopted as official policy. The policy will apply to
> MediaWiki 1.35 and later.
> 
> The new policy is designed to better protect extensions from breakage when
> things change in core, by being more restrictive about what extensions can
> safely do.
> 
> Draft document: https://www.mediawiki.org/wiki/Stable_interface_policy
> RFC ticket: https://phabricator.wikimedia.org/T193613
> 
> Please comment there. Read below for a summary of changes.
> 
> 
> Long version:
> 
> TechCom has been working on a Stable Interface Policy for MediaWiki's PHP code
> for a while[1]. Previously, the definition of the stable interface that can be
> used by extensions was part of the Deprecation Policy[2]. The new policy[3] is
> much more detailed and explicit about what extensions can expect to remain
> stable and follow the deprecation process, and which things can change without
> notice.
> 
> The introduction of the new policy is driven by problems we found while trying
> to refactor core code with the aim to reduce coupling. For instance, when
> following the Dependency Injection pattern, the constructor of service classes
> is technically public, but is not stable for use outside the module.
> 
> The solution is to be more explicit about different kinds of stability (e.g.
> whether a method is stable for callers, or can also be safely overwritten).
> 
> To allow us more freedom to restructure the source code, the new policy is 
> more
> restrictive with respect to what extensions can expect to be able to do safely
> (e.g. subclass core classes). This is balanced by improved guarantees in
> previously unspecified cases (e.g. stability of protected methods).
> 
> The new policy specifies different kinds of stability, establishes defaults 
> for
> different parts of the code, and defines new annotations to be used in the
> documentation. Once the policy has been adopted, these annotations are soon to
> be added to the code.
> 
> This will hopefully allow us to more quickly improve the structure and quality
> of core code, and reduce the risk of breaking extensions in the future.
> 
> 
> Summary of the new policy:
> 
> For extension authors:
> 
> * It's generally safe to call public methods, and to access public fields in
> classes defined by MediaWiki core, unless these methods are documented to be
> unsafe (e.g. annotated as @deprecated, @unstable, or @internal).
> 
> * It's generally unsafe to extend (subclass) classes or implement interfaces
> defined by MediaWiki core, unless that class or interface was marked as 
> @stable
> for subclassing or @stable for implementation, respectively. In particular, 
> the
> constructor signature may change without notice, and abstract methods may be
> added to interfaces.
> 
> * It's generally unsafe to directly instantiate (using new) classes defined by
> MediaWiki core, unless that class is marked as @newable.
> 
> * It's generally unsafe to rely on global variables from MediaWiki core. Use
> methods such as MediaWikiServices::getInstance() or
> MediaWikiServices::getMainConfig() instead.
> 
> 
> When changing existing code:
> 
> * Keep public methods and hook signatures backwards compatible for callers.
> Follow the deprecation process when removing them.
> 
> * Keep constructor signatures backwards compatible if the constructor was 
> marked
> @stable for calling.
> 
> * Ensure compatibility of method signatures for code that overrides them if 
> they
> are marked @stable for overriding.
> 
> * Do not add abstract methods to classes or interfaces marked as @stable for
> subclassing or @stable for implementation.
> 
> 
> When defining extension points:
> 
> * When defining hooks, keep the signature minimal, and expose narrow 
> interfaces,
> ideally only pure value objects.
> 
> * When defining an interface to be implemented by extensions, provide a base
> class, and mark it as @stable for subclassing.
> 
> * Discourage extensions from directly implementing interfaces by marking them 
> as
> @unstable for implementation. If direct implementation is to be allowed, mark
> the interface @stable for implementation.
> 
> 
> Notable changes from the 1.34 policy:
> 
> * Public methods are per default considered stable only for calling, not for
> overriding.
> 
> * Constructors are considered unstable per default.
> 
> * Classes and interfaces are considered unstable for subclassing and
> implementation, unless documented otherwise.
> 
> * Code not used in a public repository that is part of the Wikimedia ecosystem
> may be changed or removed without deprecation.
> 
> [1] https://phabricator.wikimedia.org/T193613
> [2] https://www.mediawiki.org/wiki/Deprecation_policy
> [3] https://www.mediawiki.org/wiki/Stable_interface_policy
> 

-- 
Daniel Kinzler
Principal Software Engineer, Core Platform
Wikimedia Foundation

_______________________________________________
Wikitech-l mailing list
Wikitech-l@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/wikitech-l

Reply via email to