`
hideto
  • 浏览: 2686981 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Why OO sucks

阅读更多
为什么OO很恶心

原文: http://www.sics.se/~joe/bluetail/vol1/v1_oo.html
作者:Joe Armstrong

当我第一次知道OOP的概念时,我非常疑惑,但是不知道为啥——它仅仅在感觉上“不对”。
在OOP问世之后变得粉流行(稍后解释为什么),而批评OOP就像“在教堂里咒骂”。
OO成为了每个受尊敬的语言必须具备的一部分。

而当Erlang变得越来越流行时,我们经常问一个问题“Erlang是OO的吗?”
当然正确的答案是“当然不是”——但是我们没有大肆宣扬——我们只是换了种精心设计的说法,Erlang是某种OO但不是真的是。

这时我想起在法国巴黎时IBM的老板在7th IEEE逻辑编程大会上的演讲。
IBM prolog添加了许多OO扩展,当人们问起时他说:“我们的客户想要OO的prolog,所以我们构建了OO的prolog”

我想到了“多么简单,没有良心的疑虑,没有灵魂的搜索,没有‘这是正确的事情’的问题。。。”

为什么OO很恶心

我对OOP的反对原则源自一些基本的概念,我将概述其中一些反对意见。

反对之一——数据类型和方法应该绑定在一起
对象将方法和数据结构绑定在一起成为不可分割的单元。我认为这是基本的错误,因为方法和数据结构属于完全不同的世界。为啥哩?

1,方法做事情。它们是输入和输出。输入和输出的是方法所改变的数据结构。
在大部分编程语言里,方法由命令式语句顺序构建:“做这件事然后那件事。。。”
理解方法首先得理解做事情的顺序(在懒惰函数编程语言和逻辑语言中这个限制被放宽了)
2,数据结构是结构。它们不做任何事情。它们本质上是声明。“理解”数据结构比“理解”方法简单多了。

方法作为黑盒子来转换输入和输出。如果我理解输入和输出,这样我就理解了方法。这并不意味着我可以写这个方法。

方法通常理解为在一个计算系统里用来将数据结构T1转换为数据结构T2的东西。

既然方法和数据结构是完全不同类型的动物,那么将它们锁在一个笼子里就是完全错误的。

2,反对之二——任何东西都必须为对象
考虑“时间”。在OO语言里“时间”也必须是对象。但是在非OO语言里一个“时间”是一个数据结构的实例。
例如,在Erlang里有许多不同类型的时间,它们可以使用类型声明来明确指定:
-deftype day() = 1..31.
-deftype month() = 1..12.
-deftype year() = int().
-deftype hour() = 1..24.
-deftype minute() = 1..60.
-deftype second() = 1..60.
-deftype abstime() = {abstime, year(), month(), day(), hour(), min(), sec()}.
-deftype hms() = {hms, hour(), min(), sec()}.
...

注意这些定义不属于任何特殊的对象。它们很普遍,并且数据结构表示的时间可以被系统中的任何方法处理。

没有相关联的方法。

反对之三——在一个OOP语言里数据类型定义散布到任意位置
在OOP语言里数据类型定义属于对象。
这样我就不能在一个地方找到所有的数据类型定义。
在Erlang或者C里我可以在一个单独的include文件或数据字典里定义我所有的数据类型。
在一个OOP语言里我不能——数据类型定义散布到任意位置。

让我举一个例子。假设我想定义一个通用的数据结构。通用数据类型是一个数据类型,它在系统中的任意位置出现。

lisp程序员知道,拥有一个较小数量的通用数据类型和在它上面的大量的小方法会更好。

通用数据类型就比如linked list,或者一个array或者一个hash table或者更高级的对象如time或者date或者filename。

在一个OOP语言里我不得不选择一些base对象来在里面定义通用的数据结构,所有其他想使用这些数据结构的对象必须继承该对象。
假设现在我想创建一些“time”对象,那么它应该属于哪个对象呢。。。

反对之四——对象拥有私有状态
状态是所有罪恶的根源。特别是有副作用的方法应该避免。

在编程语言里状态是令人讨厌的,而真实世界里状态却千奇百怪的存在着。
我对我的银行账户的状态很感兴趣,当我从我的账户存钱或取钱时我希望我的银行账户状态成功更新。

既然状态在真实世界里存在,那么编程语言应该提供什么能力来处理状态呢?

1,OOP语言说“将状态隐藏”。状态仅仅通过访问方法来隐藏和可见。
2,传统编程语言(C,Pascal)说状态的可见度由语言的scope规则来决定。
3,纯声明式语言说没有状态。系统的全局状态转移到方法里然后从方法里出来。
类似于monad(函数式编程语言)和DCG(逻辑语言)等机制被用来隐藏状态,这样它们可以像“有没有状态无所谓”一样来编程,但是对系统状态的完全访问是必需的。

OOP语言所选择的“隐藏状态”可能是最坏的选择。
它们不是将状态显示出来并寻找减少状态的坏处的方式,而是将状态隐藏起来。

为什么OO粉流行?

1,原因1——它被认为很容易学
2,原因2——它被认为让代码更易重用
3,原因3——它被大肆宣传
4,原因4——它创建了一个新的软件工业

我看不到原因1和原因2的证据。原因看起来像是技术背后的驱动力。
如果一个编程语言技术如此之差,然后它创建了一个新的工业来解决它自己本身的问题,则它会成为想从中牟利的人的好工具。

这就是OOP背后真正的驱动力。

以及一篇回复:Why "Why OO Sucks" Sucks
分享到:
评论
93 楼 inshua 2008-08-22  
Trustno1 写道
引用
科学本来就是这样的,没什么奇怪。

那么我觉得科学本来就不是这样的,很奇怪吗?

引用

你还没有用数学证明门纲目科分类是对是错呢,要不要试试?
http://epub.cnki.net/grid2008/detail.aspx?filename=DQXB198301004&dbname=CJFD1983

http://scholar.ilib.cn/Abstract.aspx?A=bjgydxxb200103003

http://baike.baidu.com/view/558592.htm

有些东西呢不要想当然,懒得去google就满嘴跑火车不是什么好习惯.


科学是实验科学,科学家不是巫师。数学,特别是应用数学,常常会失败,这是无法避免的,因为数学要应用,就得用数学符号对世界进行同构组织,而这个工作首先要知识完备,其次要知道确实同构才能成功。
92 楼 inshua 2008-08-22  
Trustno1 写道
引用
科学本来就是这样的,没什么奇怪。

那么我觉得科学本来就不是这样的,很奇怪吗?

引用

你还没有用数学证明门纲目科分类是对是错呢,要不要试试?
http://epub.cnki.net/grid2008/detail.aspx?filename=DQXB198301004&dbname=CJFD1983

http://scholar.ilib.cn/Abstract.aspx?A=bjgydxxb200103003

http://baike.baidu.com/view/558592.htm

有些东西呢不要想当然,懒得去google就满嘴跑火车不是什么好习惯.


无语,这可不叫用数学证明“门纲目科”分类正确啊,这应该叫用数学方法来规范门纲目科分类,采用数学方法的人,首先认定应该按门纲目科分类,然后才提出数学手段
91 楼 Trustno1 2008-08-22  
引用
科学本来就是这样的,没什么奇怪。

那么我觉得科学本来就不是这样的,很奇怪吗?

引用

你还没有用数学证明门纲目科分类是对是错呢,要不要试试?
http://epub.cnki.net/grid2008/detail.aspx?filename=DQXB198301004&dbname=CJFD1983

http://scholar.ilib.cn/Abstract.aspx?A=bjgydxxb200103003

http://baike.baidu.com/view/558592.htm

有些东西呢不要想当然,懒得去google就满嘴跑火车不是什么好习惯.
90 楼 inshua 2008-08-22  
Trustno1 写道
inshua 写道
Trustno1 写道
inshua 写道
Trustno1 写道
引用
水,无色透明

为什么无色透明呢?


经验

oh,你看过100杯水是无色透明的,你怎么知道101杯水也是透明的?


物理实验本来就是这样的,由经验,再总结规律,再验证规律对不对。


规律用什么描述呢?
100杯水是无色透明的,所以所有的水都是无色透明
1000杯水是无色透明的,所以所有的水都是无色透明
10000杯水是无色透明的,所以所有的水都是无色透明
......?



科学本来就是这样的,没什么奇怪。所以一旦在现实世界发现了有颜色的水,那就推翻了这条规律。

你会说,你可以根据水的分子模型证明它透明。没错,但是你怎么知道水只有一种分子模型?还是靠经验啊。

别忘了数学史上也曾经发生过无理数、虚数等等争执,有些东西开始认为是对的,后来又发现错了,没什么奇怪,科学就是这样。

你还没有用数学证明门纲目科分类是对是错呢,要不要试试?
89 楼 Trustno1 2008-08-22  
inshua 写道
Trustno1 写道
inshua 写道
Trustno1 写道
引用
水,无色透明

为什么无色透明呢?


经验

oh,你看过100杯水是无色透明的,你怎么知道101杯水也是透明的?


物理实验本来就是这样的,由经验,再总结规律,再验证规律对不对。


规律用什么描述呢?
100杯水是无色透明的,所以所有的水都是无色透明
1000杯水是无色透明的,所以所有的水都是无色透明
10000杯水是无色透明的,所以所有的水都是无色透明
......?

88 楼 inshua 2008-08-22  
Trustno1 写道
inshua 写道
Trustno1 写道
引用
水,无色透明

为什么无色透明呢?


经验

oh,你看过100杯水是无色透明的,你怎么知道101杯水也是透明的?


物理实验本来就是这样的,由经验,再总结规律,再验证规律对不对。

生物学就更是如此,生物学的知识基本都是经验归纳。

其实数学也是这样,只不过有些学数学的颠倒因果,把数学当成了先天地而生的东西了。也许上帝是按数学规律创造事物的,即使如此,人类今天所能确定的数学知识的边界,和上帝设立万物的数学的边界是否刚好重叠,谁能证明?
87 楼 Trustno1 2008-08-22  
引用
不过,并行计算(或者平行计算)这东西,会对我们的编程模型有影响吗?
只要无状态,就可以并行吧。

移步隔壁
http://www.iteye.com/topic/231515
86 楼 Trustno1 2008-08-22  
inshua 写道
Trustno1 写道
引用
水,无色透明

为什么无色透明呢?


经验

oh,你看过100杯水是无色透明的,你怎么知道101杯水也是透明的?
85 楼 inshua 2008-08-22  
Trustno1 写道
引用
水,无色透明

为什么无色透明呢?


经验
84 楼 Trustno1 2008-08-22  
引用
水,无色透明

为什么无色透明呢?
83 楼 inshua 2008-08-22  
还有刚才那个帅哥提的问题也很有代表性,请你用数学论证你为何叫 xx
82 楼 buaawhl 2008-08-22  
Trustno1 写道
引用
没有了赋值,就没有了IoC,没有了IoC,Template Reuse就不好写了。

赋值是一个与时序相关的操作,也就是具有并发性的IO(以运算器的视角).
因此赋值不是绝对不能用的,相反是绝对必需的.
赋值不是FP能够解决的问题,赋值与FP是互相独立没有交集的,因为lambda演算和图林机一样从来不关心IO问题.
赋值也不是十恶不赦的,十恶不赦的只是那些企图掩盖他并发性的方法,比如Von Nnumann 结构.


我想,我大致能够猜到,为什么赋值是一种I/O了。
如果把CPU寄存器范围作为标准的话,计算结果,或者中间计算结果,从寄存器中放入到内存中,也可以看作是I/O。

Von Nnumann 结构为什么掩盖并发性?

引用


http://zh.wikipedia.org/wiki/冯·诺伊曼结构

冯·诺伊曼结构(von Neumann architecture),也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。本词描述的是一种实作通用图灵机的计算装置,以及一种相对于平行计算的序列式结构参考模型(referential model)。

本结构隐约指导了将储存装置与中央处理器分开的概念,因此依本结构设计出的计算机又称储存程式型电脑。

冯·诺伊曼瓶颈

将CPU与内存分开导致所谓的冯·诺伊曼瓶颈。在CPU与内存之间的流量(资料传输率)与内存的容量相比起来相当小,在现代电脑中,流量与CPU的工作效率相比之下非常小,在某些情况下(当CPU需要在巨大的资料上执行一些简单指令时),资料流量就成了整体效率非常严重的限制。CPU将会在资料输入或输出内存时闲置。由于CPU速度以及内存容量的成长速率远大于双方之间的流量,因此瓶颈问题越来越严重。

而冯·诺伊曼瓶颈是约翰·巴科斯在1977年ACM图灵奖得奖致词时第一次出现,根据巴科斯所言:
……确实有一个变更储存装置的方法,比借由冯·诺伊曼瓶颈流通大量资料更为先进。瓶颈这词不仅是对于问题本身资料流量的叙述,更重要地,也是个使我们的思考方法局限在‘一次一字符’模式的智能瓶颈。它使我们怯于思考更广泛的概念。因此编程成为一种计划与详述通过冯·诺伊曼瓶颈的字符资料流,且大部分的问题不在于资料的特征,而是如何找出资料。


在CPU与内存间的快取内存抒解了冯·诺伊曼瓶颈的效能问题。另外,分支预测(branch prediction)算法的建立也帮助缓和了此问题。巴科斯在1977年论述的“智能瓶颈”已改变甚多。且巴科斯对于此问题的解决方案并没有造成明显影响。现代的函数式编程以及面向对象编程已较少执行如早期Fortran一般会“将大量数值从内存搬入搬出的操作”,但平心而论,这些操作的确占用电脑大部分的执行时间。



引用

http://zh.wikipedia.org/w/index.php?title=%E5%B9%B3%E8%A1%8C%E8%A8%88%E7%AE%97&variant=zh-cn

并行计算或称平行计算是相对于串行计算来说的;所谓并行计算可分为时间上的并行和空间上的并行。 时间上的并行就是指流水线技术,而空间上的并行则是指用多个处理器并发的执行计算。并行计算科学中主要研究的是空间上的并行问题。 空间上的并行导致了两类并行机的产生,按照Flynn的说法分为:单指令流多数据流(SIMD)和多指令流多数据流(MIMD)。我们常用的串行机也叫做单指令流单数据流(SISD)。MIMD类的机器又可分为以下常见的五类:并行向量处理机(PVP),对称多处理机(SMP),大规模并行处理机(MPP), 工作站机群(COW),分布式共享存储处理机(DSM)。

访存模型 并行计算机有以下四种访存模型:均匀访存模型(UMA),非均匀访存模型(NUMA),全高速缓存访存模型(COMA),一致性高速缓存非均匀存储访问模型(CC-NUMA)和非远程存储访问模型(NORMA)。

平行计算模型

不像串行计算机那样,全世界基本上都在使用天才计算机科学家冯·诺依曼的计算模型;并行计算机没有一个统一的计算模型。不过,人们已经提出了几种有价值的参考模型:PRAM模型,BSP模型,LogP模型,C^3模型等。


不过,并行计算(或者平行计算)这东西,会对我们的编程模型有影响吗?
只要无状态,就可以并行吧。
81 楼 inshua 2008-08-22  
Trustno1 写道
inshua 写道
Trustno1 写道
引用
有办法:现场探索。

我是在问题,为什么没有水,而不是有没有水.


你无非想引我说借助了很多用数学才设计出来的工具,其实这真是个可笑的问题,我已经说了,我不需要学数学才知道水龙头会流出水来。

你搞清楚因果,人类是在现实世界观察了水后,分析其物理特性后,形成数据,对照水星的观测结果,才知道水星没有水。并非凭空思考,构造了水的函数后,对水星做映射,之后 return false。

数学是工具,并不是先验哲学。


引用
第二,抛开数学,你又如何论证物理和化学特性?

你不是在重复我的话么?



抛开数学我照样能描述水的物理特性和化学特性,

水,无色透明

你的意思是非得说 水,opacity = 0?

请不要避重就轻了,你用你可爱的数学论证一下生物学按门纲目科分类是对是错吧。
80 楼 sai619 2008-08-22  
跟技术无关  跟人有关

79 楼 Trustno1 2008-08-22  
引用
没有了赋值,就没有了IoC,没有了IoC,Template Reuse就不好写了。

赋值是一个与时序相关的操作,也就是具有并发性的IO(以运算器的视角).
赋值不是绝对不能用的,相反是绝对必需的.
赋值不是FP能够解决的问题,赋值与FP是互相独立没有交集的,因为lambda演算和图林机一样从来不关心IO问题.
赋值也不是十恶不赦的,十恶不赦的只是那些企图掩盖他并发性的方法,比如Von Nnumann 结构.

只要正确地引入并发性,那么所有原先由赋值操作来完成的功能,都能找到对应的方案。比如Erlang 的genserver就是一种Ioc,template reuse.与Java IOC相比较,java的方案是一个平面化的方案,而genserver则是一个立体的方案.
78 楼 buaawhl 2008-08-22  
Trustno1 写道
引用
T1又要祭出Pattern Match的法宝了?

我说的跟Pattern Match 没有关系


引用
” Von Neumann  programming languages use variables to imitate the computer's storage cells; control statements elaborate its jump and test instructions; and assignment statements imitate its fetching, storing.……The primary statement in that world is the assignment statement itself. All the other statements of the language exist in order to make it possible to perform a computation that must be based on this primitive construct: the assignment statement.”



引用
The second world of conventional programming languages is the world of statements.…...This world of statements is a disorderly one, with few useful mathematical properties. Structured programming can be seen as a modest effort to introduce some order into this chaotic world, but it accomplishes little in attacking the fundamental problems created by the word-at-a-time von Neumann style of programming, with its primitive use of loops, subscripts, and branching flow of control.

John Backus的 1976年的图林奖领奖演说<Can Programming Be Liberated from the von Neumann Style?>

面向过程,面向对象,这些东西是不是Von Neumann 模型的产物.我说了不算,有疑义的倒是可以和Backus老爷去较较真,这位大爷当年可是Von Neumann的老部下,结构化编程的发明人.


看来,赋值语句是万恶之源。
有赋值语句的语言,就是命令式语言?就是Von Neumann 模型?
FP不是Von Neumann 模型?
FP是什么模型?

赋值这东西,确实会引起很多问题。尤其在多线程多核并行环境中。

--------------------------------

没有了赋值,就没有了IoC,没有了IoC,Template Reuse就不好写了。
FP要用好Template Reuse,就只能依靠闭包。


如果FP里面可以定义一个隐含参数 this 就好了。这个this指向本函数的外层容器。

Tuple = {A, B, F1, F2}

F1, F2 是两个函数,都有隐藏参数 this。
this指向 Tuple。
这只是一种 Hashtable方式的OO。

可以进一步模拟 VTable方式。

VTable = {F1, F2}
Tuple = {A, B, VTale}
F1, F2 是两个函数,都有隐藏参数 this。
this指向 Tuple。
这就是 VTable的OO了。

如果 FP 可以这么用,就可以完美解决 Template Reuse 的问题。

77 楼 Trustno1 2008-08-22  
引用
T1又要祭出Pattern Match的法宝了?

我说的跟Pattern Match 没有关系


引用
” Von Neumann  programming languages use variables to imitate the computer's storage cells; control statements elaborate its jump and test instructions; and assignment statements imitate its fetching, storing.……The primary statement in that world is the assignment statement itself. All the other statements of the language exist in order to make it possible to perform a computation that must be based on this primitive construct: the assignment statement.”



引用
The second world of conventional programming languages is the world of statements.…...This world of statements is a disorderly one, with few useful mathematical properties. Structured programming can be seen as a modest effort to introduce some order into this chaotic world, but it accomplishes little in attacking the fundamental problems created by the word-at-a-time von Neumann style of programming, with its primitive use of loops, subscripts, and branching flow of control.

John Backus的 1976年的图林奖领奖演说<Can Programming Be Liberated from the von Neumann Style?>

面向过程,面向对象,这些东西是不是Von Neumann 模型的产物.我说了不算,有疑义的倒是可以和Backus老爷去较较真,这位大爷当年可是Von Neumann的老部下,结构化编程的发明人.
76 楼 Trustno1 2008-08-22  
inshua 写道
Trustno1 写道
引用
有办法:现场探索。

我是在问题,为什么没有水,而不是有没有水.


你无非想引我说借助了很多用数学才设计出来的工具,其实这真是个可笑的问题,我已经说了,我不需要学数学才知道水龙头会流出水来。

你搞清楚因果,人类是在现实世界观察了水后,分析其物理特性后,形成数据,对照水星的观测结果,才知道水星没有水。并非凭空思考,构造了水的函数后,对水星做映射,之后 return false。

数学是工具,并不是先验哲学。


引用
第二,抛开数学,你又如何论证物理和化学特性?

你不是在重复我的话么?
75 楼 buaawhl 2008-08-22  
Trustno1 写道
引用
至于Haskell类型是否支持继承,是否支持单继承,多继承。从代码里面看不出来。
get_type (Image_Button a parent)="Image_Button" ++ get_type(parent)
这条代码是采用手工的方式调用另一个类型的get_type.和继承无关。有些类似于包含方式,Proxy or delegate.


class A(object):    # A must be new-style class
  def __init__(self):
   print "enter A"
   print "leave A"

class B(C):     # A --> C
  def __init__(self):
   print "enter B"
  super(B, self).__init__() 
   print "leave B"


Python 这种土了八级的语法都能叫OO,我这个就不是OO了?套用一句赵本山的话说,小样的你穿个马甲我就不认识你了?


老大,那是构造函数。而且是需要调用父方法的构造函数。
普通函数就不需要这样了。上述讨论的代码都是非构造函数的普通函数。
74 楼 jiming 2008-08-22  
那不是 OO 的错误,只是有的项目把 OO 用的太绝对了。

其实应该 OO 与面向过程结合着使用。

相关推荐

    大师品软件_Why Software Sucks

    《大师品软件_Why Software Sucks》是一本深入探讨软件设计缺陷和用户体验问题的书籍,由David S. Platt撰写。这本书旨在揭示为什么某些软件在使用过程中让人感到困扰,并提出改善软件设计的策略。作者Platt是一位...

    Why.Software.Sucks

    Any book is the product of a team effort. In this one, I've had an out- standing supporting cast. Everyone at Addison-Wesley understood and got behind the concept of a book for the users of ...

    itsucks-0.4.1开源爬虫

    【itsucks-0.4.1开源爬虫】是一个针对初学者友好的网络爬虫工具,它的出现使得没有编程背景的用户也能轻松进行数据抓取。这个最新版本的itsucks,不仅提供了完整的爬虫功能,还引入了一个简洁的图形化用户界面(GUI...

    itsucks-0.4.1.zip

    【itsucks-0.4.1.zip】是一个包含开源Java Web Spider项目的压缩包,这个项目被称为itSucks。itSucks的设计目标是帮助用户轻松构建网络爬虫,它使用了Web机器人技术,允许用户通过定义下载规则来抓取网页内容。项目...

    itsucks开源代码

    爬虫源码,开源 java 很好 强大 可扩展

    信息安全_数据安全_Why_the_role_of_CISO_sucks_and_w.pdf

    信息安全_数据安全_Why_the_role_of_CISO_sucks_and_w 信息安全研究 金融安全 安全人才 安全对抗 法律法规

    why-your-test-suite-sucks

    标题“why-your-test-suite-sucks”暗示了我们讨论的主题是关于测试套件存在的问题以及如何改进它们。测试套件是软件开发过程中的重要组成部分,它确保代码的质量、稳定性和可靠性。然而,当测试套件出现问题时,...

    Atc Sucks-crx插件

    【Atc Sucks-crx插件】是一款针对英文用户的浏览器扩展程序,主要目的是表达用户对“ATC”(可能是某个网站、服务或功能的缩写)的不满情绪。这款插件由开发者创建,用于向用户展示ATC存在的问题,或者提供某种方式...

    Smooth Scroll Sucks-crx插件

    因此,【Smooth Scroll Sucks-crx插件】致力于让浏览器的滚动条重获自由,释放用户在浏览时可能遇到的困扰。它通过禁用页面上的平滑滚动特效,使鼠标滚轮和触摸板的操作更加直接,使浏览体验更接近传统习惯。 现代...

    Vegandale Sucks-crx插件

    【Vegandale Sucks-crx插件】是一款专为英文用户设计的浏览器扩展程序,主要功能是替换网络上关于“Vegandale”的相关信息,将其转化为“Gentrified Parkdale”。这款插件针对的是那些可能对“Vegandale”这一名称...

    itsucks:http

    ItSucks 网络爬虫 描述 这个项目是一个具有下载(和恢复)文件能力的java网络蜘蛛(网络爬虫)。 它还可以使用正则表达式和下载模板进行高度定制。 所有后端功能也可在单独的库中使用。 官网 执照 本地开发使用 将 ...

    IE Sucks-crx插件

    IE SUCKS这么糟糕,实际上是有趣的观看失败! IE样式信息条在页面中的障碍码时发光。 无广告! Internet Explorer是一个浏览器的F ****笑话,并字面上持有进步! 在逐步淘汰之前庆祝最终几天,用IE吸收插件。 每当...

    rabbit sucks!-crx插件

    【标题】:“rabbit sucks!-crx插件”是一个针对特定网站或应用的浏览器扩展,其主要功能是优化用户界面,提供更加个性化的浏览体验。这个插件的名称可能具有一定的幽默感,暗示它可以帮助用户摆脱某些他们不喜欢的...

    DuPont Sucks FTP-开源

    DuPont Sucks FTP(DPS-FTP)是一个开源的FTP客户端工具,专为用户提供便捷的文件传输服务。这个项目的名称“DuPont Sucks FTP”可能源于一种幽默或反讽的表达,暗示它并非由杜邦公司开发,而是由社区驱动的独立项目...

    kevingreen.sucks

    【标题】"kevingreen.sucks" 是一个网站项目,基于 "Simple Next App" 构建,主要用于表达对个人或事物的不满或者批评。在互联网上,".sucks" 域名通常被用来创建一个平台,让人们可以公开讨论他们认为有问题的事物...

    IE吸盘「IE Sucks」-crx插件

    使用IE Sucks插件庆祝淘汰前的最后几天。 每当遇到旨在帮助Internet Explorer像老人一样上楼的代码时,我们都会像过去一样发出经典的IE信息栏。 您知道,这意味着您只有更多无用的废话可以破坏您的浏览器,除非这次...

    sucks:用python制作的小CRUD

    标题中的“sucks:用python制作的小CRUD”表明这是一个使用Python编程语言开发的简单创建、读取、更新和删除(Create, Read, Update, Delete,简称CRUD)应用程序。CRUD是数据库操作的基础,是任何数据管理系统的基石...

    your-band-sucks-v2:通过不良专辑封面分享音乐

    【标题解析】:“your-band-sucks-v2”很可能是一个音乐相关的项目或应用,可能是由开发者创建的一个幽默或者讽刺性的音乐分享平台。"v2"表示这是项目的第二个版本,通常意味着在原有基础上进行了改进和优化。 ...

    Moments Sucks-crx插件

    如果您确实讨厌Twitter内的Moments标签,并且在尝试查看通知时始终单击此处,则只需安装此… 如果您确实讨厌Twitter内的Moments选项卡,并且在尝试查看通知时始终单击此处,则只需安装此轻量级扩展程序即可将其发送...

Global site tag (gtag.js) - Google Analytics