Powershell 源码批判
代码里充斥着过程式编程的搞法:比如这里 Utils.PathIsUnc,分散的到处都是
internal static IEnumerable<string> GetDefaultAvailableModuleFiles(string topDirectoryToCheck)
{
if (!Directory.Exists(topDirectoryToCheck)) { yield break; }
var options = Utils.PathIsUnc(topDirectoryToCheck) ? s_uncPathEnumerationOptions : s_defaultEnumerationOptions;
面向对象架构打的很烂。powershell 的 purpose 本来很棒,像 provider 的设计思路究竟根本,悟到了产品的核心。源码中解释器这一部分也很老练,非常漂亮。但可能因为是团队作业,部分看起来简单的活交给了一帮水平一般的人,可能是实习生,导致整体拉跨。
powershell 由于不能像 linux 一样建立在一个什么都是文件的基础上,转而提出了 provider,provider 提供 LisAllDrives GetChildItem 等动作,以支持 cd ls 等命令,比 linux shell 更进一步,powershell 的这些 provider 可以让一切都是对象。但是这个 provider 是以一组过程的形式提供的,像 FileSystemProvider 甚至硬编码到了程序中,而 Environment 之类也不固定由 EnvironmentProvider 提供,事实上,源码中操作这些 Provider 的手段非常蹩脚。这些 Provider 是面向最终产品的,而不是某个框架的组件,导致它们几乎只能用于 Powershell 用户。
问题出在哪儿呢,如果换我上,powershell 的设计应当围绕虚拟文件系统展开。
对,就是虚拟文件系统这个词。往往就是一个词,就可以击中问题核心,这是因为这个词表达的概念提炼了问题的本质。很多产品的设计,要点都是那么一两个核心概念,相信真正做过设计的人都深有体会,而很多不懂行的人却觉得这个不值钱,没有价值,谁知道差以毫厘谬以千里,缺乏哲学性的思考终将导致大量耗损。
如果 powershell 重新设计,它应该围绕一个容纳关系的虚拟文件系统展开。任何可以实现这个虚拟文件系统的协议都可以挂载,包括 webdac, ftp, sftp 等等,虚拟文件系统提供 url 访问,和 linux 不同的是 URL 指称的是对象。基于虚拟文件系统,所有概念都将变得非常简单。
- 比如 Environment,可以通过 Session.Mount(EnvironProvider) 挂载,挂载后可以通过 Session.VFS["env:USERPROFILE"] 访问环境变量
- 通过 Session.VFS["reg:/HKLM/XXX"] 可以访问注册表
- 通过 Session.VFS["file:C:\Windows"] 可以访问文件/文件夹对象
- 通过 Session.VFS["file:C:\Windows"].GetChildren("System32") 访问子文件
- 通过 Session.VFS["file:C:\Windows"].GetChildren("System32/cmd.exe").Content 访问文件内容,
- 通过 .Run() 执行
这样这个产品中框架+语言充分解耦,解释器依赖框架,而框架可以不依赖解释器。这也就意味着虚拟文件系统这套框架可以单独工作,因此框架也就可以轻松的用于其它基于 .net 的脚本语言————如果接上 RPC,甚至采用任何语言都可以。powershell 代码中硬编码极多的远程访问问题也就迎刃而解了。
考虑到这个虚拟文件系统存放的已经不只是文件,叫它层次化对象系统更妥当————都是树。
建议推到重来。
Powershell 源码批判的更多相关文章
- 【转载】chromium浏览器开发系列第一篇:如何获取最新chromium源码
背景: 最近摊上一个事儿,领导非要让写一篇技术文章,思来想去,自己接触chrome浏览器时间也不短了,干脆就总结一下吧.于是乎,本文顺理成章.由于有些细节必需描述清楚,所以这次先讲如何拿到ch ...
- Chromium浏览器高级开发系列第一篇:如何获取最新chromium源码
背景: 最近摊上一个事儿,领导非要让写一篇技术文章,思来想去,自己接触chrome浏览器时间也不短了,干脆就总结一下吧.于是乎,本文顺理成章.由于有些细节必需描述清楚,所以这次先讲如何拿到ch ...
- 车大棒浅谈jQuery源码(二)
前言 本来只是一个自己学习jQuery笔记的简单分享,没想到获得这么多人赏识.我自己也是傻呵呵的一脸迷茫,感觉到受宠若惊. 不过还是有人向批判我的文章说,这是基本知识点,完全跟jQuery源码沾不上边 ...
- Spring源码分析——源码分析环境搭建
1.在Windows上安装Gradle gradle工具类似于maven,用于项目的构建,此处主要用于构建spring源码,以便我们将spring源码导入eclipse. 开发环境 Java:JDK8 ...
- [源码]Python简易http服务器(内网渗透大文件传输含下载命令)
Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...
- 转载:浏览器开发系列第一篇:如何获取最新chromium源码
背景: 最近摊上一个事儿,领导非要让写一篇技术文章,思来想去,自己接触chrome浏览器时间也不短了,干脆就总结一下吧.于是乎,本文顺理成章.由于有些细节必需描述清楚,所以这次先讲如何拿到ch ...
- VsCode源码编译运行
参考链接官方文档:https://github.com/Microsoft/vscode/wiki/How-to-Contribute 一.准备环境 Git Node.js(64位,>= 8.1 ...
- OpenMPI源码剖析:网络通信原理(二) 如何选择网络协议?
因为比较常用的是 TCP 协议,所以在 opal/mca/btl/tcp/btl_tcp.h 头文件中找到对应的 struct mca_btl_tcp_component_t { mca_btl_ba ...
- chromium浏览器开发系列第一篇:如何获取最新chromium源码
背景: 最近摊上一个事儿,领导非要让写一篇技术文章,思来想去,自己接触chrome浏览器时间也不短了,干脆就总结一下吧.于是乎,本文顺理成章.由于有些细节必需描述清楚,所以这次先讲如何拿到c ...
- kubeadm源码分析
k8s离线安装包 三步安装,简单到难以置信 kubeadm源码分析 说句实在话,kubeadm的代码写的真心一般,质量不是很高. 几个关键点来先说一下kubeadm干的几个核心的事: kubeadm ...
随机推荐
- 日干算命api接口_json数据_性格/爱情/事业/财运/健康运势免费接口
该API接口基于传统的八字学原理,通过用户提供的日干信息,为用户提供性格.爱情.事业.财运和健康等多方面的运势分析和建议.以下是该接口的详细介绍: 一.功能概述 性格分析:根据用户的日干信 ...
- KubeSphere 3.3.2 版本正式发布!
距离上一个版本 v3.3.1 发布,已经过了 3 个多月,今天我们很高兴宣布 KubeSphere v3.3.2 正式发布! 此版本由 68 位贡献者参与代码提交,感谢各位贡献者对 KubeSpher ...
- IPV6改造 华为云如此简单
现在很多企业都在搞这个IPV6改造,说实话这个IPV6改造我这边也不是特别精通,也是通过查阅各种资料来了解IPV6这个东西,下面是我查的一些资料大家可以借鉴一下. IPv6改造三步曲--Vecloud ...
- RecyclerView刷新方式
RecyclerView刷新方式 刷新全部item notifyDataSetChanged() student.setValue(new Student("二狗")); stud ...
- 我开源了一个短视频应用(Go+React)|DouTok2.0 项目介绍
前言 大家好,这里是白泽,拖更了一段时间,抱歉.在 DouTok2.0 可以初步允许大家接入开发之后,这篇文章才得以出炉. DouTok:一个开源的 web 端的短视频应用,采用微服务架构,包含前后端 ...
- PLSQL安装配置与汉化
一.下载安装 1.官方安装包下载链接:https://www.allroundautomations.com/plsqldev.html 如下图所示,可自行选择32位或者64位 2.下载后双击安装至指 ...
- springboot 复杂邮件发送
application.yml配置 密码为邮箱开启smtp时邮箱服务商提供的密码
- BasicDataSourceFactory类简介
BasicDataSourceFactory实现了javax.naming.spi.ObjectFactory接口. 因此,先从ObjectFactory学习. 一.ObjectFactory接 ...
- 【2024.08.15】NOIP2024暑假集训模拟赛(13)
[2024.08.15]NOIP2024暑假集训模拟赛(13) T1 先找能构成回文的最长前缀和后缀(长度相同的),然后在任意一边的基础上扩展,看能否接一个回文串. #include<bits/ ...
- 关于CP2102(USB转TTL模块)的驱动安装、电脑识别、接线
一.CP2102 与 CH340 对比 特性 CP2102 CH340 芯片制造商 Silicon Labs WCH(江苏沁恒) 接口 USB USB 最大波特率 1 Mbps 2 Mbps 支持操作 ...