苛评VCL: 混乱的TStream

本文探讨了VCL中TStream类的不合理设计,特别是其包含了与流职责无关的Component相关方法。作者建议通过分离职责改进这一设计,并分析了可能的历史背景和技术原因。
<p style="text-indent: 21pt;">为什么这么苛刻地来评论VCL的基础类设计,我已经在前一篇关于TObject的文章中讲过。今天我拿出在一次跟踪VCL代码的过程中发现的问题。在此之前,我没有任何理由会相信会存在这样的情况。</p>
<p style="text-indent: 21pt;">TForm读取dfm文件创建窗体过程大家一定都比较清楚,其中负责读取的是Classes.pas单元中的TReader类,而它在实现的时候,会调用到如下的函数:</p>
<blockquote>
<pre><strong>function</strong> InternalReadComponentRes(<strong>const</strong> ResName: <strong>string</strong>; HInst: THandle; <strong>var</strong> Instance: TComponent): Boolean;<br><strong>var</strong><br> HRsrc: THandle;<br><strong>begin</strong> { avoid possible EResNotFound exception }<br><strong>if</strong> HInst = 0 then HInst := HInstance;<br> HRsrc := FindResource(HInst, PChar(ResName), RT_RCDATA);<br> Result := HRsrc <> 0;<br><strong>if</strong> <strong>not</strong> Result <strong>then</strong> Exit;<br><strong>with</strong> TResourceStream.Create(HInst, ResName, RT_RCDATA) <strong>do</strong><br><strong>try</strong><br> Instance := ReadComponent(Instance);<br><strong>finally</strong><br> Free;<br><strong>end</strong>;<br> Result := True;<br><strong>end</strong>;</pre>
</blockquote>
<p style="text-indent: 21pt;">大家请注意TResourceStream的方法ReadComponent。是的,我想说的其实就是这个方法。大家可以回过头来看看TStream的声明:</p>
<blockquote>
<pre>...<br><strong>function</strong> ReadComponent(Instance: TComponent): TComponent;<br><strong>function</strong> ReadComponentRes(Instance: TComponent): TComponent;<br><strong>procedure</strong> WriteComponent(Instance: TComponent);<br><strong>procedure</strong> WriteComponentRes(<strong>const</strong> ResName: <strong>string</strong>; Instance: TComponent);<br><strong>procedure</strong> WriteDescendent(Instance, Ancestor: TComponent);<br><strong>procedure</strong> WriteDescendentRes(<strong>const</strong> ResName: <strong>string</strong>; Instance, Ancestor: TComponent);<br><strong>procedure</strong> WriteResourceHeader(<strong>const</strong> ResName: <strong>string</strong>; <strong>out</strong> FixupInfo: Integer);<br><strong>procedure</strong> FixupResourceHeader(FixupInfo: Integer);<br><strong>procedure</strong> ReadResHeader;<br>...</pre>
</blockquote>
<p style="text-indent: 21pt;">对于Stream这个抽象概念,很多人对它的理解过程都是曲折的。但不管怎么样,它基本特性还是比较清晰的。Read、Write、Position、Seek等等基本方法,构成了流的基本属性。</p>
<p style="text-indent: 21pt;">然而,令我不明白的地方是,为什么Delphi会在基础类TStream中增加上述的那些有关Component的方法。这些显然和流的职责没有关系!</p>
<p style="text-indent: 21pt;">在单一职责原则中,建议将两种不同的职责分成两个类实现,或继承、或组合。要说TStream的这些Component的方法,要么可以定义单独的Component资源类,要么做出TStream的Helper类。但总比像VCL这样设计好吧。</p>
<p style="text-indent: 21pt;">现在猜想VCL当时的设计情形,很可能Classes单元的类,很多是为了Delphi的组件系统的实现(或者说是IDE本身)。所以很多类在设计的时候,默认都引入了TComonent类。</p>
<p style="text-indent: 21pt;">这么说是有根据的,不光是TStream类,在这个单元中的TParser类也是如此。我发现TParser类的时候是非常惊喜的,但是使用后发现,其规则是按照dfm来做的。在分析Delphi的源码的时候,会遇到注释不能识别的问题。</p>
<p style="text-indent: 21pt;">一向认为单一职责最难把握,现在看VCL,呵呵,确实如此啊。</p>
内容概要:本文介绍了基于Koopman算子理论的模型预测控制(MPC)方法,用于非线性受控动力系统的状态估计与预测。通过将非线性系统近似为线性系统,利用数据驱动的方式构建Koopman观测器,实现对系统动态行为的有效建模与预测,并结合Matlab代码实现具体仿真案例,展示了该方法在处理复杂非线性系统中的可行性与优势。文中强调了状态估计在控制系统中的关键作用,特别是面对不确定性因素时,Koopman-MPC框架能够提供更为精确的预测性能。; 适合人群:具备一定控制理论基础和Matlab编程能力的研【状态估计】非线性受控动力系统的线性预测器——Koopman模型预测MPC(Matlab代码实现)究生、科研人员及从事自动化、电气工程、机械电子等相关领域的工程师;熟悉非线性系统建模与控制、对先进控制算法如MPC、状态估计感兴趣的技术人员。; 使用场景及目标:①应用于非线性系统的建模与预测控制设计,如机器人、航空航天、能源系统等领域;②用于提升含不确定性因素的动力系统状态估计精度;③为研究数据驱动型控制方法提供可复现的Matlab实现方案,促进理论与实际结合。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注Koopman算子的构造、观测器设计及MPC优化求解部分,同时可参考文中提及的其他相关技术(如卡尔曼滤波、深度学习等)进行横向对比研究,以深化对该方法优势与局限性的认识。
内容概要:本文研究了基于物理信息神经网络(PINN)求解二阶常微分方程(ODE)边值问题的方法,并提供了完整的Matlab代码实现。文章通过将微分方程的物理规律嵌入神经网络损失函数中,利用神经网络的逼近能力求解边值问题,避免传统数值方法在网格划分和迭代收敛方面的局限性。文中详细介绍了PINN的基本原理、网络结构设计、损失函数构建及训练流程,并以典型二阶ODE边值问题为例进行仿真验证,展示了该方法的有效性和精度。此外,文档还附带多个相关科研方向的Matlab案例资源链接,涵盖状态估计、优PINN物理信息神经网络用于求解二阶常微分方程(ODE)的边值问题研究(Matlab代码实现)化调度、机器学习、信号处理等多个领域,突出其在科学研究中的实际应用价值。; 适合人群:具备一定数学基础和Matlab编程能力的理工科研究生、科研人员及从事科学计算、工程仿真等相关工作的技术人员。; 使用场景及目标:①用于求解传统数值方法难以处理的复杂或高维微分方程问题;②为科研工作者提供PINN方法的入门实践路径,推动其在物理建模、工程仿真等领域中的创新应用;③结合所提供的丰富资源拓展至电力系统、故障诊断、优化调度等交叉学科研究。; 阅读建议:建议读者结合文中的Matlab代码逐行理解PINN实现机制,动手复现并尝试修改方程形式与边界条件以加深理解,同时可参考附带资源扩展应用场景,提升科研效率与创新能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值