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 ...
随机推荐
- 【赵渝强老师】在MongoDB中使用游标
一.什么是游标? 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 游标实际上是一种能从包括多条数据记录的结果集 ...
- TEN Framework 入坑记
TL;DR TEN Framework 最初叫 Astra,后改为 TEN,即 Transformative Extensions Network. 我第一次见到 TEN (那时还叫 Astra)是在 ...
- 如何快速定位 Linux Panic 出错的代码行
问题描述 内核调试中最常见的一个问题是:内核Panic后,如何快速定位到出错的代码行? 就是这样一个常见的问题,面试过的大部分同学都未能很好地回答,这里希望能够做很彻底地解答. 问题分析 内核Pani ...
- Nuxt.js 应用中的 page:transition:finish 钩子详解
title: Nuxt.js 应用中的 page:transition:finish 钩子详解 date: 2024/10/10 updated: 2024/10/10 author: cmdrago ...
- iOS中RunLoop和线程的关系
RunLoop又叫运行循环,主要用来管理线程.一个线程对应一个RunLoop,一个RunLoop又有五种模式.只有主线程的RunLoop是默认开启的,所以程序在开启后,会一直运行,不会退出.其他线程的 ...
- KNN算法:近朱者赤,近墨者黑
文章目录 1.一个例子 2.算法原理 3.算法的优缺点 3.关于 K 的选取 4.代码实现 今天我要讲的这个算法是最近邻算法(K-NearestNeighbor),简称 KNN 算法. 1.一个例子 ...
- 《大话设计模式》java实现:第一章-简单工厂模式
在<大话设计模式>中,示例代码使用C#实现,所以我这里使用Java实现一遍书中的设计模式. 第一章是使用简单工厂实现计算器. 遇到了一个问题:在Operation父类中,我们可以定义两个操 ...
- 关于Java后台处理前端用户传来数据过大,超过数据库字段设置长度导致的异常问题处理
在DTO bean对象上使用javax验证(如最小值,最大值等,请参阅here).
- 2024/10/3 CSP-S模拟赛20241003
A 恶心恶心恶心,赛时写了一个二分+线段树的复杂度错了,当时yzh和lyz就一会骗我一会说实话的,搞得很懵,自己水平也是菜,那线段树分析复杂度怎么不把递归次数乘上呢?大傻逼grz 思路其实还挺好的. ...
- 2.6 使用dd命令安装Linux系统
面对大批量服务器的安装,人们往往热衷于选择"无人值守安装"的方式,而此方式需要对服务器进行过多的配置,并不适合初学者. 无人值守安装(Kickstart),又称全自动安装,其工作原 ...