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 ...
随机推荐
- 【赵渝强老师】什么是Oracle的数据字典?
数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一组提供有关数据库信息的表和视图的集合,这些表和视 ...
- 简单 webapi 登录成功就返回 电脑的进程信息·
/// <summary> /// 如果登录成功就返回电脑的进程信息 /// </summary> /// <returns></returns> [H ...
- 密码学承诺之原理和应用 - Kate多项式承诺
主页 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ GIT地址:https://github.com/warm3snow 简介 多 ...
- G-数据结构-G
\[\huge 近日多做数据结构题,或恐后再读不能醒悟,或记其思路,或骂出题人,或不想刷题,虽有此篇. \] \[\] \[\] \[\] \[\] T1 距离 首先这题部分分很多,直接 $ O (n ...
- KubeSphere 宣布开源 Thanos 的企业级发行版 Whizard
日前,青云科技宣布开源 Thanos 的企业级发行版 Whizard,为企业带来真正高可用.可扩展.可存储与查询海量监控数据.易运维.安全的 Prometheus 长期存储方案. Prometheus ...
- 快速部署和测试ingress-nginx:1.9.6
点击查看代码 下载deploy文件 https://github.com/kubernetes/ingress-nginx/blob/controller-v1.9.6/deploy/static/p ...
- @RequestBody注解转对象中驼峰格式的参数无法接收到数据的问题解决方法
1.问题:驼峰格式的参数传递到后端,@RequestBody注解标注的实体对象参数没有接收到对应的数据 前端传参:执行结果:请求参数实体: import lombok.Data; /** * 请求参数 ...
- Java8之新特性
简单例子 实例: 处理集合时,通常会迭代遍历它的元素,并在每个元素上执行某项操作,例如假设我们想要对某本的所有长单词进行计数,首先需要将所有单词放到一个列表中 var contents = new ...
- jquery datatable 全选,反选 参考文档
1 版本号 DataTables 1.10.12 2 API文档地址 http://datatables.club/reference/option/ 官方option http://datatabl ...
- 深度解析:Air780E模组之SIM卡接口电路的设计原理
SIM卡接口用于连接SIM卡并读取SIM卡信息,以便在注册4G网络时进行鉴权身份验证,是4G通信系统的必要功能. 合宙低功耗4G模组经典型号Air780E支持两路SIM卡,支持双卡切换,便于设备灵 ...