Kirovj's Chaos


用Java重构Python项目的感概

Posted on

虽然还有许多工作需要做,但无论怎样还是终于接近尾声了。在这里也记录一下这两个月重构过程中遇到的困难和感慨吧。

看大型项目还是很吃力

尽管工程结构不是很复杂,逻辑与设计模式比较清晰(毕竟是 python )。但是整体看下来还是比较头大,需要反复 debug 才能让整个运行逻辑比较清晰。

最大的阻力自然是类型。虽然项目中大部分都有辅助类型推断( PEP8 ),但是吧比如:

from typing import List
def foo() -> List[Union(A, B)]:
    pass

这在 Java 中你不得不加以抽象或者其他方式来解决。

cpython 的特性也是一大阻力,因为底层是c, IDE 无法直接索引到c标准库源码,所以你会发现很多标准库的方法点进去只有一个 pass (其实这个也是 IDE 帮你显示的,因为底层是c模块)。

当然了,还有 python 一大堆的高级语法特性。比如 itertools 包中的许多方法( groupby ...)、列表生成式中的列表生成式还嵌套了 map | filter 、闭包、无处不在的 yield | yield from ...


PDF - 给计算机看的文字

重构的项目是和 pdf 有关的。『 PDF - 给计算机看的文字』这句话简单来说, PDF 就不是被设计出来编辑的,而是实体文档在数字世界中的影像。

先看一下 word 底层的源码:

<w:pPr>
    <w:jc w:val="center"/>
    <w:rPr><w:rFonts w:ascii="Times" w:hAnsi="Times"/><w:lang w:val="en-US"/></w:rPr>
</w:pPr>
<w:r w:rsidRPr="003C75CF">
    <w:rPr><w:rFonts w:ascii="Times" w:hAnsi="Times"/></w:rPr>
    <w:t>Hello world!</w:t>
</w:r>

这就是 docx 格式这类标记语言 ( Markup Language )文档的特征:在纯文本上包裹各种「标签」( tag )来描述文本的样式(颜色、位置、字体等等),从而获得格式丰富多变的文档。常见的网页( HTML )、 Evernote 笔记( ENML )所用的语法本质上都是标记语言,区别只在于支持的标签各不相同、因此能实现的格式有多有少罢了。

看一下 pdf 的源码:

BT
    1 0 0 1 1036 572 Tm
    /TT1 12 Tf
    [ (He) 24 (l) -48 (l) -48 (o) ] TJ
ET
BT
    1 0 0 1 1147 572 Tm
    /TT1 12 Tf
    ( ) Tj
ET
BT
    1 0 0 1 1160 572 Tm
    /TT1 12 Tf
    [ (w) 24 (or) -84 (l) -24 (d) ] TJ
ET

以上是 PDF 的部分源码,显示了字符串 Hello world

翻译一下:

【文字开始】
    缩放比例1倍 坐标(1036,572) 【文字定位】
    /TT1 12磅 【选择字体】
    [ (He) 间距24 (l) 间距-48 (l) 间距-48 (o) ] 【绘制文字】
【文字结束】
【文字开始】
    缩放比例1倍 坐标(1147,572) 【文字定位】
    /TT1 12磅 【选择字体】
    (空格) 【绘制文字】
【文字结束】
【文字开始】
    缩放比例1倍 坐标(1060,572) 【文字定位】
    /TT1 12磅 【选择字体】
    [ (w) 间距24 (or) 间距-84 (l) 间距-24 (d) ] 【绘制文字】
【文字结束】

不同于 word , pdf 的语言则更像是在控制机器,定位、调整、落笔、抬起,移动到下一行;如此重复。

当然,以上只是 pdf 中很小部分的介绍,详细的可以看下 adobe 公司的 pdf 标准文件

以及一些延伸阅读:

👆🏻感谢:理解数字世界中的纸张:PDF | 科普


JNI 与 SWIG

todo!


算法的不足