声明性函数命名

问题描述 投票:1回答:1

如何命名函数以清楚地反映它们遵循declarative paradigm

上下文:我最近开始着手创建以声明性方式工作的库,但是我很难提出一个反映它的命名约定。过去,我使用createThing之类的名称创建了命令式函数,但是我发现很难简洁地传达“在函数名称中执行必要的操作以返回看起来像____的Thing”的想法。理想情况下,我想遵循正式的标准或既定的命名约定。否则,我希望至少能从现有的代码库中找到一些指导。

language-agnostic naming-conventions declarative
1个回答
0
投票

根据我的经验,在声明性框架中没有针对主要功能的规范命名方案,但是有许多著名的示例可以从中得到启发。

与FluentInterface样式关联的方法通常以'with'开头。例如

new HTTPClient()
   .withProxy(new Proxy('localhost', 8080))
   .withTimeOut(Duration.of("30s"))
   .withRequestHeaders(
     new Headers()
        .with('User-Agent', 'FluidClient')
   );

请参见https://martinfowler.com/bliki/FluentInterface.html

某些FluentInterface设计取消了函数名称前缀,而仅在它们表示的声明元素之后直接命名函数。来自JOOQ的示例:([https://www.jooq.org/doc/3.12/manual/getting-started/use-cases/jooq-as-a-standalone-sql-builder/

String sql = create.select(field("BOOK.TITLE"), field("AUTHOR.FIRST_NAME"), 
                         field("AUTHOR.LAST_NAME"))
                   .from(table("BOOK"))
                   .join(table("AUTHOR"))
                   .on(field("BOOK.AUTHOR_ID").eq(field("AUTHOR.ID")))
                   .where(field("BOOK.PUBLISHED_IN").eq(1948))
                   .getSQL();

这具有使命令式调用链像声明式DSL一样读取的好处。但是,避免使用方法的命名约定可能会使构建器类的源可读性降低。

以上示例是用于构建对象的构建器,其中封装状态用于表示要声明的概念。一些OO框架进一步减少了这种情况,从而使代码仅根据“细粒度”对象的构造函数组成。在大多数c派生的语言中,构造函数都必须以与它们关联的类型来命名。

[在Flutter中声明一个UI小部件树的示例(来自https://flutter.dev/docs/development/ui/widgets-intro#using-material-components:]:

 return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: Icon(Icons.menu),
          tooltip: 'Navigation menu',
          onPressed: null,
        ),
        title: Text('Example title'),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.search),
            tooltip: 'Search',
            onPressed: null,
          ),
        ],
      ),
      // body is the majority of the screen.
      body: Center(
        child: Text('Hello, world!'),
      ),
      floatingActionButton: FloatingActionButton(
        tooltip: 'Add', // used by assistive technologies
        child: Icon(Icons.add),
        onPressed: null,
      ),
    );
© www.soinside.com 2019 - 2024. All rights reserved.