如何命名函数以清楚地反映它们遵循declarative paradigm?
上下文:我最近开始着手创建以声明性方式工作的库,但是我很难提出一个反映它的命名约定。过去,我使用createThing
之类的名称创建了命令式函数,但是我发现很难简洁地传达“在函数名称中执行必要的操作以返回看起来像____的Thing
”的想法。理想情况下,我想遵循正式的标准或既定的命名约定。否则,我希望至少能从现有的代码库中找到一些指导。
根据我的经验,在声明性框架中没有针对主要功能的规范命名方案,但是有许多著名的示例可以从中得到启发。
与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,
),
);