日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Java和Python中类似Kotlin的生成器,续:附加参数

發(fā)布時(shí)間:2023/12/3 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java和Python中类似Kotlin的生成器,续:附加参数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

在今天的文章中,我們將繼續(xù)上周的文章,內(nèi)容涉及用Java和Python制作類似于Kotlin的構(gòu)建器,擴(kuò)展構(gòu)建器API以采用一些可選參數(shù)來提高靈活性。 我們繼續(xù)我們HTML示例,嘗試添加標(biāo)記屬性,例如類,id和樣式。

Kotlin和Python

Kotlin設(shè)置這些參數(shù)的用法的方式與我在Python中的使用方式完全相同:默認(rèn)參數(shù)和命名參數(shù)。 使用Kotlin看起來像這樣:

html {body {p(klass="myClass", id="theParagraph") {+ "the paragraph text"}} }

請(qǐng)注意,使用“杯子”而不是“類”。 關(guān)鍵字和標(biāo)識(shí)符的經(jīng)典沖突。 您可以根據(jù)需要使用“ cls”,“ clazz”或其他任何東西。 我建議不要使用類對(duì)象語言中通常使用的任何東西,因?yàn)檫@是完全不同的類。

與上周的p標(biāo)簽相比,這是一個(gè)很大的升級(jí)(只是p = "text" ),將其從屬性更改為成熟的方法。 但是大多數(shù)其他示例不需要太多工作。 這是更新的Kotlin代碼:

class Body {...fun p(class: String="", id: String="", style: Style=Style.blank, paragraphBuilder: Paragraph.() -> Unit) {val p = Paragraph(class, id, style)paragraphs.add(p)p.paragraphBuilder()}... }class Paragraph(val class: String, val id: String, val style: Style) {var text: String = ""operator fun plus(other: String) {text += other} }

更新后的Python代碼(仍使用第一個(gè)版本)如下所示:

class Body:def __init__(self):self.paragraphs = ...def p(self, klass='', id='', style=None):par = Paragraph(klass, id, style)self.paragraphs.append(par)return parclass Paragraph:def __init__(self, klass, id, style):self.klass = klassself.id = idself.style = styleself.text = ''def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):return Falsedef __iadd__(self, text):self.text += text

__iadd__()是就地加法運(yùn)算符,允許我們說p += 'text' 。 在Kotlin中,我們使用+而不是+=因?yàn)槲覀儾槐匾枚温鋵?duì)象,因此以+=開頭似乎是錯(cuò)誤的,而我們需要在Python代碼中引用p ,因此+=看起來更自然,這樣,我們就可以將調(diào)用代碼更改為以下形式:

html = Html() with html as html:with html.body() as body:with body.p(class='myClass', id='theParagraph') as p:p += 'the paragraph text'

Kotlin和Python都采用Style對(duì)象,而不是像其他字符串一樣僅接受另一個(gè)字符串。 實(shí)際上,我建議也對(duì)class和id做同樣的事情,因?yàn)閺哪菚r(shí)起,我們將class和id對(duì)象及其CSS設(shè)置傳遞給CSS生成器。 我只是為了舉例而沒有在這里做。 我不讓Style保留字符串,因?yàn)樽詈檬褂媚撤NCSS樣式生成器來提供更好的清晰度和正確性。

Java

Kotlin和Python都使過渡非常簡(jiǎn)單。 不幸的是,Java沒有設(shè)置必需的功能來進(jìn)行如此簡(jiǎn)單的更改。 您必須依靠古老的流利的API技巧來使您順利通過。

重載嘉豪!

首先想到的是盡可能多地進(jìn)行帶有大量重載的轉(zhuǎn)換。 您可以為class和id字段創(chuàng)建快速,方便的字符串包裝器,因?yàn)樗鼈兌贾皇亲址?#xff0c;因此很難區(qū)分兩者:

class Class {public final String text;public Class(String text) {this.text = text;} }class ID {public final String text;public ID(String text) {this.text = text;} }

這使得所有重載看起來像這樣:

class Body {...public void p(Consumer<Paragraph> paragraphBuilder) {...}public void p(Class klass, Consumer...) {...}public void p(ID id, Consumer...) {...}public void p(Style style, Consumer...) {...}public void p(Class klass, ID id, Consumer...) {...}// and so on... 3 more times... }

這變得非常乏味,以至于我什至沒有寫完每一行,更不用說開始所有行了。 而且這僅考慮了類,id和樣式。 還有更多。 走這條路是不好的。 因此,我什至不會(huì)顯示結(jié)果代碼的樣子。 另外,對(duì)于其余的想法,我不會(huì)費(fèi)心地展示API的實(shí)現(xiàn),希望它是不言而喻的。 如果您真的對(duì)如何實(shí)現(xiàn)一種API感到好奇,請(qǐng)告訴我。

內(nèi)部設(shè)定

設(shè)置這些屬性的另一種方法是在構(gòu)建器中進(jìn)行設(shè)置。 提供用于設(shè)置這些值的“ Paragraph方法。 在body標(biāo)簽內(nèi)看起來像這樣:

html.body(body -> {body.p(p -> { p.klass = "myClass"; p.id = "theParagraph";p.addText("the paragraph text");}); });

這并不可怕(尤其是在第一行上有那些設(shè)置程序行;將它們放在后續(xù)行上會(huì)混淆其目的),并且這可能是最簡(jiǎn)單的,但是錯(cuò)誤代碼的可能性卻很高:

html.body(body -> {body.p(p -> {p.klass = "myClass";p.addText("the paragraph text");p.id = "theParagraph";}); });

讓我們看看其他選項(xiàng)。

屬性對(duì)象

僅使用p()兩個(gè)重載(一個(gè)僅接受構(gòu)建器函數(shù),而一個(gè)重載并與Attributes對(duì)象一起),我們可以制作一個(gè)非常干凈的API,看起來像這樣:

html.body(body -> {body.p(Attributes.klass("myClass").id("theParagraph"), p -> {p.addText("the paragraph text");}); });

就個(gè)人而言,這是我的最愛。 它需要更多的類和更多的實(shí)際復(fù)雜性,但是我覺得它是最可擴(kuò)展的。 最大的不便是不同HTML標(biāo)簽具有不同的屬性集。 可能應(yīng)該有一個(gè)公共的“ Attributes構(gòu)建器類,再加上一個(gè)特定于標(biāo)記的類,從而使重載次數(shù)最多達(dá)到4(沒有屬性,只有基本的屬性,只有特定于標(biāo)記的屬性,以及這兩種類型)。 四個(gè)重載是可以容忍的,但可能不應(yīng)該。 如果看起來太多,最好還是堅(jiān)持最后一種策略。

為了完整起見,我還有一個(gè),它實(shí)際上可能對(duì)其他不模仿HTML或XML的API更好地工作。

通話后大樓

最后一個(gè)想法是讓Body.p()返回Paragraph (最好是構(gòu)建器的第二階段,因?yàn)檫@些方法可以在構(gòu)建器lambda中使用,否則可以)調(diào)用這些方法,如下所示:

html.body(body -> {body.p(p -> {p.addText("the paragraph text");}).klass("myClass").id("theParagraph"); });

這實(shí)際上將Attributes類移到末尾,作為“ Paragraph構(gòu)建器的第二階段。

奧托羅

那是我能給你的最好的。 如果您有興趣使用Java之類的語言來構(gòu)建流暢的API,則應(yīng)查閱jOOQ的文章,了解它們的用法 。 這是一種完全不考慮lambda的不同方式,這很好。 無論如何,下周我將發(fā)表一系列簡(jiǎn)短的書評(píng)文章時(shí),我將與你們交談。

翻譯自: https://www.javacodegeeks.com/2016/01/kotlin-like-builders-java-python-continued-additional-parameters.html

總結(jié)

以上是生活随笔為你收集整理的Java和Python中类似Kotlin的生成器,续:附加参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。