代码 > GUI程序的代码分层
2025-05-09
重构了下代码,整理了一下最新的代码的分层。
Application 应用层,这个一般跟框架来
UI交互层:ViewModel/View/Controller,这个也跟框架来,这里不放重的逻辑,展示层
Services服务层:处理各种交互用的数据,展示层
Cores核心层:各个核心子系统放在这里,业务层。程序的全局预设也放在这里。同时定义一个单例AppKernel,放具体的核心子系统的实例。业务层
Helpers帮助类:处理业务逻辑和各种跨Model交互的数据,业务层
Adapters:各种与系统交互的实现,比如文件IO/网络IO,分为Interface和实现,方便测试。定义一个单例 SystemAdapter,用于存放实际使用的具体Adapter的实现。
Models模型类,具体的数据,和简单处理,数据层。
utils工具类,简单的工具函数。
不同的Core里 通过Bus总线提供互相调用,事件太不可靠。
先暂时按这个走,感觉Helpers和Cores里面可以加一层业务层。
看看又没有问题。
代码 > c#XUnit单元测试避免涉及单例的测试的并发数据竞争
2025-05-08
使用单例时,如果测试并发进行,很明显会造成数据读写冲突。
但是很多时候业务层涉及单例的测试时必须的。
使用XUnit时可以通过集合的注解来避免这个问题
参考
https://stackoverflow.com/questions/1408175/execute-unit-tests-serially-rather-than-in-parallel
实际代码
先定义一个单例的集合类
[CollectionDefinition("MainState", DisableParallelization = true)]
public class StateCollection
{
}
然后在会使用的这个单例的类里使用Collection注解
[Collection("MainState")]
public class RelationMapperTest
{
}
即可。
代码 > csharp用后感
2025-04-25
怎么说呢
csharp这个语言,用起来,的确有优点,有缺点。
真的让我感觉用起来很舒服的,其实只有两个点
第一个是partial关键字,可以把一个类拆成很多个文件来写,这个的确我会滥用。
另一个是字段和属性的无缝转换,字段转属性直接写get和set就好,不需要调整其他地方调用的代码。
至于不爽的地方,就是全局OOP模式了。
我写个单例都不能写在全局变量里,必须写一个静态方法。
蛋疼的不行。
代码 > 发现现在做GUI程序的思路基本已经定型了
2025-04-16
不管做APP还是PC端基本一样。
首先是View+ViewModel搞定显示(前端)
然后当中插入一层引擎,串接起负责提供数据给VM,然后通过Event和嵌入的UI Interface和前端交互,引擎大概率引入个单例,从引擎层分为可交互和不可交互两层。
这样可以做到UI无关化,方便测试,方便GUI转API/CLI,彻底分层
接着是Service层,为处理Model数据的代码提供封装和帮助。
然后是Model层,实际的数据/业务的处理。
感觉还是Frontend+API那套底子。
代码 > 解决csharp xml序列化的hexadecimal value 0x00, is an invalid character问题
2025-04-11
最近在做xml序列化,发现这个问题。
一开始怀疑是源文件问题或者对象失效问题,拿着原文件不停删除行对比,发现具有随机性。
搞了几小时。
起床后灵机一动,是不是真有无效字符,立刻寻找\0字符串。
发现固定在原始数据解析的最后一个元素上。
然后再一查
是读文件的问题
之前用的
var body = new byte[fileStream.Length];
fileStream.Read(body, 0, (int)fileStream.Length);
不行
需要使用
ReadExactly
或者
var body=new StreamReader(fileStream,Encoding.UTF8).ReadToEnd();
的形式。
这命名,绝对属于踩到屎山了。
代码 > 上手avaloniaui初体验
2025-03-28
在不需要行动力的地方,我行动力总是高的可怕。
找了个需求出来,开始做avaloniaui项目。
怎么说呢,对于vscode的支持一般,和vscode下的flutter体验完全不能比。
csharp本身语法糖有点多,少用点糖就行,Dart也算照着csharp一顿猛抄,所以上首速度还挺快。
axaml个是,也就是学xaml,用xml布局做画面的,和flutter的用代码写组件的体验完全不能比,总觉得丹疼的紧,也没有Vue那么丰富的模板语法。
AOT的话本身体验还行。裁减或打包出来的文件也不多,和flutter桌面版那一家老小一起出游的感觉不同。
继续写写,再体会体会。
代码 > 粗读了一遍C#图解教程
2025-01-24
既然决定要搞C#,那么在节前花了点时间找了个教程粗读了遍。
跳过了短期肯定不会去用的反射,粗看了泛型,其他的仔细过了编。
怎么说呢,csharp到底是这么多年的老语言了,语法层面,不说和C类语言的共通性,真的优点其实也被别的语言抄的差不多了。至少我在脑子里不停的在想:这个Flutter(Dart)抄过了,这个Flutter(Dart)也抄过了。
至于剩下的,没抄过的,至少在我这个一向推行使用多种编程语言的人来看,是在是只适合特殊场景,不值得抄。
对,我说的就是看到很多人吹的委托/事件和Linq。
委托和事件,在某些业务里的确重要,但作为一个通用语言来看的话,这么高优先级优点没必要。
至于Linq,看着那和SQL类似的语句,我只能说,恩,真牛逼,可我真用不上……
读完了,再招点资料和说明,准备开始写了。
代码 > 2025技术栈整理
2025-01-09
整理下自己手头的技术栈
1.golang
这个没的说,的确好用。
可以取代php/python/各种脚本
基本是个 可编译 强类型 基础库强大 的脚本语言。
特别时map和slice,太脚本化了。
能取代大部份使用脚本语言的场景
2.javascript
这个没得说,浏览器里大量使用,各个语言也有成熟的vm可以使用。至于TS,感觉不太适合我用的场景,绝大部分情况下,脚本语言对我只是胶水或者可配置逻辑,实际复杂应用还是走go
3.vue2
等到vue2什么时候停止更新了,再找新的前端框架吧。别的前端框架,哪怕vue3,都太重了,脱离了我对前端的需求
4.flutter/dart
对于一个熟悉前端,不经常写app的人来说,flutter太好用了。dart基本就时一个js,大部份场景下也有很多现成的flutter插件,各种云厂商的支持sdk也很多。随便捏一捏就能弄个app上架了,比较适合我的需求场景。android/ios原生开发实在离我太远,没必要
5.avaloniaui/c sharp
怎么说呢,flutter的确很好用,但再有些场合,太移动端为主,未毕合适。而且c sharp背后有微软在,各个领域未必时第一,但前三的解决方案总有。而且要说实话,golang太脚本化,很多场景c sharp可能会更好用一点。现在dotnet的linux支持看起来也不错,算是今年的研究反向了。20年前最火的时候没学,20年后再去学,也满有意思的。
其他的能看懂就行的语言
php:实在用途狭窄了
python:大部份场景不如用golang,能改改别人的python脚本就行了
lua:这个,实在,太不好用
java:能看懂就行,实在不想学
c:万物离不开C,总有可能要做ffi的
代码 > 试了下avaloniaui
2025-01-08
今天发现avaloniaui支持vscode了。
再本地跑了下,在linux应该说能用,但开发体验和vscode的flutter天差地别,只能说能用罢了。
考虑今年空下的时间搞搞看.net
不求多熟悉,能谢谢最基本的工具就行。
背景有微软这个大山在,各种生态还是不愁的。
至于投入太多精力么,也不至于,毕竟普通人还是跟不上微软的思路的。