动词类Verb的实现相对较为复杂。
首先,我们定义了name和verbType这两个成员变量,分别用于保存动词名称和动词类型。
随后,我们定义了一个构造方法。它接收动词名称verbName作为入参,将其保存至成员变量name中,并使用字典工具类DictionaryUtils中的getVerbType方法获取动词类型。其中字典工具类的具体实现将在后面介绍。
现在,准备工作已经就绪,我们就可以开始编写具体的变形方法了。
我们注意到,日语动词的各类变形虽然各不相同,但基本都遵循以下规则:
一类动词:把最后一个假名变成其他的段再添加后缀
二类动词:把る去掉再加后缀
三类动词-する:把する去掉后加后缀
三类动词-来る:把来る去掉再加后缀
这个逻辑可以抽出来写成一个通用变形函数verbUtil,这样就不用在每种变形中都写一遍了。那么,如果某种变形有特殊情况,或者和通用变形逻辑不兼容,应该怎么办呢?这其实很容易解决,只需要先执行此变形的特殊逻辑,未命中时再执行通用逻辑即可。
这个函数接收6个参数:
specificDan:一类动词最后的假名需要变为哪一段
godanSuffix:一类动词的后缀
ichidanSuffix:二类动词的后缀
suruSuffix:三类动词する的后缀
kuruSuffix:三类动词来る的后缀
kuruNewKana:来る写作假名くる时,く对应的新假名
于是,便可以根据不同的动词类型和入参,对不同类型的动词执行通用变形逻辑。
此外,这段代码中使用了五十音图工具类GojuuonzuUtils中的toSpecificDan方法来实现一类动词中假名变为其他段的功能,以及VerbTypeConstants常量类中的动词类型,其具体实现将在后面介绍。此外,这里还兼容了某些古语残留的类型,这不是本文介绍的重点,因此从略。
下面,我们便可以利用这个通用逻辑来实现て形方法teForm了。
首先,我们需要考虑行く和問う这两种特殊情况。
行く:去掉最后的く并变为って
問う:直接加て
其次,一类动词的て形变形逻辑与之前提到的通用变形逻辑冲突,因此需要实现特殊逻辑。如果动词为一类动词,那么就会直接执行特殊逻辑并返回,不会再执行通用逻辑。
以「る、つ、う」结尾:去掉最后一个假名并添加って
以「ふ、ぬ、む」结尾:去掉最后一个假名并添加んで
以「す」结尾:去掉最后一个假名并添加して
以「く」结尾:去掉最后一个假名并添加いて
以「ぐ」结尾:去掉最后一个假名并添加いで
最后,如果动词未命中前两种情况,则会执行通用逻辑verbUtil。
二类动词:去掉最后一个假名并添加て
三类动词-する:去掉する并添加して
三类动词-来る:去掉来る并添加来て(若写作くる,则去掉くる并添加き和て)
对于ない形方法naiForm,其实现也比较类似。
首先,我们需要考虑ある这种特殊情况。
ある:去掉ある并添加ない
其次,执行通用逻辑verbUtil。
一类动词:将最后一个假名变为あ段,并添加ない
二类动词:去掉最后一个假名并添加ない
三类动词-する:去掉する并添加しない
三类动词-来る:去掉来る并添加来ない(若写作くる,则去掉くる并添加こ和ない)
其余的变形也是类似的逻辑,这里不再赘述。在实现时需要特别注意的是,日语书上往往会遗漏某些特殊的情况,例如:
(て形)行く→行って
(て形)問う→問うて
(ない形)ある→ない
(ます形)くださる→くださいます
(命令形)くださる→ください
(命令形)くれる→くれ
完整的实现代码如下所示。