能把队友气死的8种屎山代码(React版)

NMS非极大值抑制算法原理 NMS非极大值抑制算法 阅读详情

前几天在前端技术群里聊起Code Review的事,大伙儿似乎都憋了一肚子气:

我觉得这份难言之隐应该要让更多人,就跟Henry约了个稿:

于是Henry赶在周末,一边带娃,一边给我抹眼泪整理(脱敏)出了这篇小小的屎山合集,供大家品鉴。

以下是正文。


1. 直接操作DOM

const a = document.querySelector('.a');

const scrollListener = throttle(() => {
  const currentY = window.scrollY;

  if (currentY > 100) {
    a.classList.add('show');
  } else {
    a.classList.remove('show');
  }
}, 300);

window.addEventListener('scroll', scrollListener);
return () => {
  window.removeEventListener('scroll', scrollListener);
};

上面的代码在监听scroll方法的回调函数中,直接上手修改DOM的类名。众所周知,React属于响应式编程,大部份情况都不需要直接操作DOM,具体原因参考官方文档(https://react.dev/learn/manipulating-the-dom-with-refs)。

优化方法也很简单,充分发挥响应式编程的优点,用变量代替即可:

const [refreshStatus, setRefreshStatus] = useState('');

const scrollListener = throttle(() => {
  if (tab.getBoundingClientRect().top < topH) {
    setRefreshStatus('show');
  } else {
    setRefreshStatus('');
  }
}, 300);

return <div className={['page_refresh', refreshStatus].join(' ')}/>;

2. useEffect不指定依赖

依赖参数缺失。

useEffect(() => {
    console.log('no deps=====')
    // code...
});

这样的话,每次页面有重渲染,该useEffect都会执行,带来严重的性能问题。

例如我们项目中,这个useEffect内部执行的是第一点中的内容,即每次都会绑定一个scroll事件的回调,而且页面中有实时轮询接口每隔5s刷新一次列表,用户在该页面稍加停留,就会有卡顿问题出现。

解决方案很简单,根据useEffect的回调函数内容可知,如果需要在第一次渲染之后挂载一个scroll的回调函数,那么就给useEffect第二个参数传入空数组即可,参考官方文档(https://react.dev/reference/react/useEffect#useeffect)。

useEffect(() => {
    // code...
}, []);

3. 硬编码

硬编码,即一些数据信息或配置信息直接写死在逻辑代码中,例如

这两行代码本意是从url上拿到指定的参数的值,如果没有,会用一个固定的配置做兜底。

乍一看代码逻辑很清晰,但再想深一层,兜底值具体的含义是什么?为什么要用这两个值来兜底?写这行代码的同学可能很快可以解答,但是一段时间之后,写代码的人和提需求的人都找不到了呢?

这个示例代码还比较简单,拿对应的值去后台可以找到对应的含义,如果是写死的是枚举值,而且还没有类型定义,那代码就很难维护了。

解决此类问题,要么将这些内容配置化,即写到一个config文件中,使用清晰的语义化命名变量;要么,至少在硬编码的地方写上注释,交代清楚这里需要硬编码的前因后果。

4. 放任文件长度,只着眼于当下的需求

很多同学做需求、写代码都比较少从全局考虑,只关注到当前需求如何完成。从“战术”上来说没有问题,快速完成产品的需求、快速迭代产品也是大家希望看到的。

可一旦只关注“战术实现”而忽略“战略设计”,除非做的产品是月抛型的,否则一定会遇到旧逻辑难以修改的情况。

如果再加上一个文件被多达10余人修改过的情况,那么每改一行代码都会是一场灾难,例如最近接手的一个页面:

单文件高达1600多行!哪怕去除300多行的注释,和300多行的模板,剩下的逻辑代码也有1000行左右,这种代码可读性就极其糟糕,必须进行拆分。

而很常见的是,由于每一任经手人都疏于考虑全局,导致大量代码毫无模块化可言,甚至出现多个useEffect的依赖是完全相同的:

这里明显还有另一个问题:滥用hooks。

从行号可以看出来确实是相同的依赖写了多个useEffect,很明显是多个同学各写各的的需求引入的这些hooks。

这代码跑肯定是能跑的,但是很可能会出现多个hooks中修改同一个变量,导致其他地方在使用的时候需要搞一些很tricky的操作来修Bug。

5.变量无初始值

在typescript的加持下,对变量的类型定义可以说是日益严格了。可是在一些变量的类型定义比较复杂的情况下,可能一个变量的字段很多、层级很复杂,此时有些同学就可能想偷个懒了,例如:

const [variable, setVariable] = useState<ComplicatedType>();

// some code...
const queryData = function() {
    // some logic
    setVariable({ show: true });
};

useEffect(() => {
    queryData();
}, []);

return variable.show ? <Component /> : null;

这里的问题很明显,如果queryData耗时比较长,在第一次渲染的时候,最后一行的variable.show就会报错了,因为variable的初始值是undefined。所以声明变量时,一定要根据变量的类型设置好有效默认值。

6. 三元选择符嵌套使用

网上很多人会推荐说用三元选择符代替简单的if-else,但几乎没有见过有人提到嵌套使用三元选择符的事情,如果看到如下代码,不知道各位读者会作何感想?

{condition1 === 1
    ? "数据加载中"
    : condition2
    ? "没有更多了"
    : condition3
    ? "当前没有可用房间"
    : "数据加载中"}

真的很难理解,明明只是一个简单的提示语句的判断,却需要拿出分析性能的精力去理解,多少有点得不偿失了。

这还只是一种比较简单的三元选择符的嵌套,因为当各个条件分支都为true时,就直接返回了,没有做更多的判断,如果再多做一层,都会直接把人的cpu的干爆炸了。 

替代方案: 

  1. 直接用if-else,可读性更高,以后如果要加逻辑也很方便。

  2. Early Return,也叫卫语句,这种写法能有效简化逻辑,增加可读性。

if (condition1 === 1) return "数据加载中";
if (condition2) return "没有更多了";
if (condition3) return "当前没有可用房间";
return "数据加载中";

虽然不嵌套的三元选择符很简单,但是在例如jsx的模版中,仍然不建议大量使用三元选择符,因为可能会出现如下代码:

return (
    condition1 ? (
        <div className={condition2 ? cls1 : cls2}>
            {condition3 ? "111" : "222"}
            {condition4 ? (
                <Component prop1={condition5 ? a : b} />
            ) : null
        </div>
    ) : (
        <Component2>
            {condition6 ? children1 : children2}
        </Component2>
    )
)

类似的代码在我们的项目中频繁出现,模版中大量的三元选择符导致文件内容拉得很长,很容易看着看着就不记得自己在哪个逻辑分支上了。

像这种简单的三元选择符,做成一个简单的memo变量,哪怕是在组件内直接写变量定义(例如:const clsName = condition2 ? cls1 : cls2),最终到模板的可读性也会比上述代码高。

7. 逻辑不拆分

React hooks可以很方便地帮助开发者聚合逻辑抽离成自定义hooks,千万不要把一个页面所有的useState、useEffect等全都放在一个文件中:

其实从功能上可以对页面进行拆分,拆分之后这些变量的定义也就可以拆出去了。

其中有一个很简单的原则就是,如果一个逻辑同时涉及到了useState和useEffect,那么就可以一并抽离出去成为一个自定义hooks。

例如接口请求大家一般都是直接在业务逻辑中做:

const Comp = () => {
    const [data, setData] = useState({});
    const [loading, setLoading] = useState(false);
    
    useEffect(() => {
        setLoading(true);
        queryData()
            .then((response) => {
                setData(response);
            })
            .catch((error) => {
                console.error(error);
            })
            .finally(() => {
                setLoading(false);
            });
    });
    
    if (loading) return "loading...";
    
    return <div>{data.text}</div>;
}

根据上面的原则,和数据拉取相关的内容涉及到了useState和useEffect,这整块逻辑就可以拆出去,那么最终就只剩下:

const Comp = () => {
    const { data, loading } = useQueryData();
    
    if (loading) return "loading...";
    
    return <div>{data.text}</div>;
};

这样下来,Comp组件就变得身份清爽了。

大家可以参考阿里的ahooks库,里面收集了很多前端常用的hooks,可以极大提升开发效率和减少重复代码。

8. 随意读取window对象的值

作为大型项目,很容易需要依赖别的模板挂载到window对象的内容,读取的时候需要考虑到是否有可能拿不到window对象上的内容,从而导致js报错?例如:

window.tmeXXX.a.func();

如果这个tmeXXX所在的js加载失败了,或者是某个版本中没有a这个属性或者func这个函数,那么页面就会白屏。

好啦,最近CR常出现的8种屎山代码都讲完了,你写过哪几种?你们团队的代码中又有哪些让你一口老血喷出来的不良代码呢?欢迎评论区告诉我。

3、★☛基于STM32的手机通过wifi控LED灯√♠★ 3、基于STM32的手机通过wifi控LED灯 文章目录3、基于STM32的手机通过wifi控LED灯1、Introduce介绍1.1、课题背景及其意义1.2、 国内外的研究状况2、方案的设计2.1、控制方案的确定2.2、控制方式的选择2.2.1、 单片机芯片的选择方案一方案二方案三方案四2.2.2、无线遥控模块的选择方案一方案二方案三3、硬件电路的设计3.1、系统的功能分析及体系结构设计3.1.1、系统功能分析3.1.2、系统总体结构3.2、模块电路的设计3.2.1、 STM32单片机核心电路设计3.2. 阅读详情

相关推荐

MaPLe: Multi-modal Prompt Learning

具体而言,我们在语言分支中附加可学习的上下文标记,并通过耦合函数显式地将视觉 Prompt 置于语言 Prompt 上,以建立它们之间的交互。使用 Prompt 来适应CLIP (语言或视觉) 的单个分支中的表示是次优的,因为它不允许在下游任务上动态调整两个表示空间的灵活性。由此,提出了一种分支感知的多模态 Prompt,通过在两种模态之间共享提示来协调 CLIP 的视觉和语言分支。在 Prompt Tuning 中,必须采取多模态方法获得同时适应 CLIP 的视觉和语言分支,以实现上下文优化的完整性。

weixin_48907099的博客 1051

何为屎山代码?

编程圈流传着这样一个有趣的小故事:一个哥们上班忽然怒气冲冲,大声质问:“这 TMD 谁写的代码,这么明显的 bug 都能写出来,还不写注释?屎山代码,也被称为"祖传代码",是历史遗留问题,是前人留给我们的"宝藏"。你一个人硬着头皮改,你必然疲惫不堪,身心俱疲,最后也必成拉屎之人,千万不要明知山有屎,偏向屎山行。通过良好的编程习惯,清晰的代码结构,充分的注释和文档,我们可以为后来者留下一个更加稳固的代码基础…但听我一句劝:屎山代码虽然看着难受,但一旦动手,山就可能塌了,将自己深埋于屎山之中,臭不可闻。

专注于全栈开发领域 1万+

用电脑通过网口控制keysight示波器

Keysight HD304MSO示波器提供1GHz带宽、14位高精度ADC及10.1英寸触控屏,支持50μV低噪声信号捕获和1.3M波形/秒刷新率。配备4通道探头、逻辑分析仪接口及100Mpts存储深度,含故障诊断、FFT等高级功能。通过网线连接电脑安装TightVNC软件(示波器IP为169.254.163.24)可实现远程控制,相比U盘传输更高效。(149字)

johnboat的专栏 1136

能把队友气死的几种屎山代码

前几天在技术群里聊起Code Review的事,大伙儿似乎都憋了一肚子气:我觉得这份难言之隐应该要让更多人看到,就约了个稿:整理(脱敏)出了这篇小小的屎山合集,供大家品鉴。可能存在下面一些问题直接来一个代码例子,这是一个获取背景颜色的方法,但是随着业务的不断变化,背景颜色的来源越来越多,在一些业务人员的处理下可能是这样的:相信你在读上面的代码的时候是极为痛苦的,想要一目了然的知道最终会进入哪个分支,基本不可能。于是基于下面两个原则有了一个基础版本的重构:依赖参数缺失。 这样的话,每次页面有重渲染,该us

qq_66627105的博客 2693

保姆级教程:用Unidbg搞定阿里系App的x-sign和长x-mini-wua签名(附完整Java代码)

本文详细介绍了如何使用Unidbg框架模拟执行阿里系App的原生库,生成关键的x-sign和x-mini-wua签名参数。通过完整的Java代码示例和实战技巧,帮助开发者高效实现签名算法,适用于安全研究、数据分析和第三方应用开发场景。

weixin_29243279的博客 485

深入解析摄像头硬件接口:DVP、MIPI-CSI2与USB的技术对比与应用场景

本文深入解析了摄像头三大主流硬件接口DVP、MIPI-CSI2与USB的核心技术差异。DVP接口作为并行传输的“老兵”,成本低但带宽和抗干扰能力有限;MIPI-CSI2凭借差分串行设计成为移动高清设备的首选,具备高带宽和强抗干扰性;USB接口则依托UVC标准实现了跨平台的即插即用。文章通过对比传输方式、带宽、应用场景等关键维度,为智能硬件、嵌入式系统等领域的工程师提供了清晰的选择指南。

c7d8e的博客 515

7年无人敢动的「屎山」代码:if循环19.8亿次

你是不是也有这样的问题?????速戳看视频????黑马视频号你玩过“侠盗猎车手5”(简称GTA 5)这个游戏吗?这个游戏是由Rockstar Games游戏公司(被玩家称作R星)出版发...

传智播客的专栏 3万+

多传感器融合SLAM指南:如何结合视觉与激光雷达提升建图精度

本文深入探讨了多传感器融合SLAM技术,详细解析了如何将视觉传感器与激光雷达(特别是3D激光雷达)进行深度融合以提升建图精度与鲁棒性。文章从传感器特性分析、数据同步标定、前端融合策略(松耦合与紧耦合)到后端优化与地图构建,提供了完整的实战指南,并重点介绍了V-LOAM等经典融合框架的核心思想,旨在帮助开发者构建适应复杂动态环境的高精度SLAM系统。

weixin_29056145的博客 535

Vue2屎山代码大盘点

危害程度:⭐️⭐️⭐️⭐️⭐️写个注释是举手之劳,花不了多少时间,而且前面所有的屎山堆起来,如果有注释的话还是可以快速理解其含义的,但是如果再加上不写注释,那就是天坑了,谁也救不了这个屎山;罗马的道路不是一日铺成的,屎山的代码也不是一天写成的,而是在每个开发者无所谓的心态下堆成的,如果平时多注意注意至少也能保证自己写的代码”留有余香“。建议读完本文之后再读一读参考文章,最后是严格地执行!如果以时间不够为借口而不执行那么看再多的文章也没有用!堆屎山没有终点,持续更新中......

BASK2311的博客 1930

精益六西格玛Python数字化应用开发-Day18 应用场景:家电企业生产效率优化

本文将重点介绍专门针对精益六西格玛黑带使用场景的 Python 库,这些库功能侧重于数据分析和流程优化,特别适用于 DMAIC 方法论和看板管理。考虑到读者具备中高级Python 使用经验,我们将深入探讨各库的高级功能和实际应用应用场景。 某家电企业生产线自动化程度高,数据量巨大,希望通过精益管理提升生产效率。企业借助 Python 脚本,打通各类数据源(MES、ERP、设备日志),自动归集生产数据,分析各工序的生产节拍、设备停机、效率损失,快速定位瓶颈环节

m0_56592100的博客 905

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案。

1291

甲骨文 2500 万行的屎山代码有多“恐怖”?

【导读】:2018 年 Hacker News 上一篇对 Oracle 屎山代码的吐槽帖子,@宝玉XP 老师最近翻译了,转过来大家一起看看。Oracle 数据库 12.2 版本竟然包含了将近 2500 万行的 C 语言代码。想想都觉得可怕!在这个产品里,改动哪怕一行代码,都有可能导致成千上万的测试失败。历经数代程序员在紧迫的截止日期中辛勤编写,结果却是代码变得杂乱无章。Oracle 中复杂的逻辑、内存管理、上下文切换等功能,竟然是靠成千上万个标志 (flags) 来维系的。

IT界那些事儿 1万+

人工智能混合编程实践:C++调用封装好的DLL进行异常检测推理

C++、Python、ONNX、人工智能、异常检测、Anomalib 2.1.0

FriendshipTang的博客 170

什么是屎山代码?

如果你也想学习:黑客&网络安全的零基础攻防教程为什么说再厉害的程序员,也怕屎山代码?首先,屎山代码不是指的一种开发语言,而是对庞大项目的一个别称。常言道,屎山传万代,代代不吱声。每次传承都会遗留大量问题,接手的人一般都不敢动代码,只要项目能跑动就行了。有一些初生牛犊不怕虎的新人自认为能力很强,决定重构或者修改屎山,但往往都是搬着石头砸自己脚—自讨苦吃。究其原因,还是因为老程序员很多不喜欢写备注,语法比较随性,导致代码冗余,但后面项目大起来,改又不好改了,屎山只能越堆越多。

资深程序员,曾自学JAVA,C#,如今从业于网安行业 4037

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

何为屎山代码,如何避免

今天我们来聊聊前端界的屎山代码。所谓的“屎山代码”,通常指那些难以维护、逻辑混乱或违反最佳实践的代码。想象一下这个场景:同事:“帮我改个按钮颜色,5分钟搞定!你打开代码,发现:按钮样式被写死在20个地方全局样式表里有3个冲突的 .btnJS 里居然用定时器强制覆盖颜色…这需求,老子不做了!(然后默默按下了Ctrl+S)”遇到这种代码,真的是要人老命!这里我给大家总结了一些常见的前端屎山代码,大家看看有没有中过招、踩过坑。

h_TVT的博客 2141

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

写了十几年程序,今天才第一天知道什么是屎山代码

可以说,我确实没在工作中用过Javascript,因为我从未见过如此“厚颜无耻”的代码我曾经也是学过2~3年,还是JQuery的年代,但应该确实没在实战中用过,否则我怎么会不记得写过这些屎山代码的???(当年,第一个吃到螃蟹的,赚到第一桶金的是DICUZ,PHP的;真还不是写JAVASCRIPT的)

大话程序员 2988

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

程序员都来看看,Vue2屎山代码大盘点

相比其他的框架来说,Vue中更容易产出屎山代码;因为Vue中的options就是一个大对象,导致js本身的很多检测都失效了,比如一个函数没有用到的话会“变灰”,template中代码提示比较少,较多的mixins等等

Python966的博客 1347

如何根本上解决屎山代码的问题

业务扩展点清晰,业务价值已经可以持续提升;可扩展性高,较长时间可快速迭代;可维护性高,不易出现故障;代码可规范化,可管理。

剑飞的架构思维 5922

程序员一定要知道的!屎山代码风格指南(避免被优化&&避免被接盘)

2.1.引入evil.js。

kfashfasf的博客 1914

祖传代码为何是屎山

可能使用单个字母作为变量名,如“i”“j”“k”等,这在短代码片段中或许还能勉强理解,但在大型复杂的程序中,根本无法清晰地传达变量的实际含义。当需要添加新的功能时,可能需要在现有的代码中进行大量的修改,而不是通过添加新的模块来实现。祖传代码可能在新的软件环境下出现兼容性问题,例如无法在新的操作系统上正常运行,或者与新的数据库版本不兼容。没有测试用例的支持,你很难确定修改后的代码是否会引入新的错误。全局变量的使用会增加代码的复杂性和不确定性,因为任何地方都可以修改全局变量的值,这使得代码的行为难以预测。

chinansa的博客 1876

史上最强C语言屎山代码之Hello World炸裂版

摘要:本文戏谑地分析了一段以"_"和下划线为主体的"屎山代码"HelloWorld炸裂版,将其比作编程世界的抽象艺术。代码中充满神秘的下划线森林、指针幽灵和未知符号,完全颠覆了传统C语言的可读性规范。作者通过"迷宫探险"的比喻,幽默地描述了阅读这段代码时的困惑体验,最终以"仅供娱乐"的提醒收尾,暗讽某些过度复杂的代码风格。全文用150字生动展现了一段让人啼笑皆非的编程"艺术品"。

memoryfurong的博客 1378

为什么祖传代码被称为「屎山」?

而且,正如一些观点所指出的,小公司的祖传代码可能确实可以称为「屎山」,但在大公司中,这些代码可能是漂浮在更广阔“屎海”上的“随着时间的推移,即使是经验丰富的开发者也会对自己的早期作品感到羞愧,认为当时的代码就像是狗屎一样。这种称呼源自于开发者在面对这些代码时的感受,它们往往包含了大量累加、冗余以及完全无用的代码,使得这些代码几乎无法被理解。这种情况在项目开发时间紧迫、任务重的情况下尤为常见,导致代码质量下降,形成了所谓的“屎山此外,这种称呼还体现了一种对过去代码的无奈和批评态度。

Sebdhsk的博客 6071

leetcode暴力屎山代码(一)——leetcode4

leetcode第四题:寻找两个正序数组的中位数

m0_49587154的博客 700

为什么祖传代码被称为「屎山」?这个回答简直太形象了

经常听说祖传代码会被人称之为「屎山」,不同人可能有不同的体会,最近看到一个回答,简直是把这个阐述得“活灵活现”,大家来感受下吧。“ 阅读本文大概需要 3 分钟。 ”作者:Avalon原文...

静觅 2万+

屎山代码的由来:每一行 if (version < 1.0) 背后,都是无法触达的“活化石”

于是,即便到了 2025 年,你的服务器里可能还跑着一段 2015 年写的、满是漏洞的加密代码,只为了伺候那群“活化石”用户。他们从第三方论坛下载了“去广告版”、“破解版”,签名被改了,无法通过应用商店更新。僵尸用户不仅白嫖了内容,还变成了 DDoS 攻击源,疯狂消耗你的服务器流量。你永远无法通知这批用户去更新,除非你给他们的手机发短信,求他们卸载重装。里加个判断:“如果是 v1.0 的请求,就拦截它,让他去升级”。那些用着 v1.0 破解版的用户,成了永远无法封禁的“特权阶级”。

郑龙飞 686

Vue屎山代码大盘点

作者:蚂小蚁链接:https://juejin.cn/post/7246686667750785083前言相比其他的框架来说,Vue中更容易产出屎山代码;因为Vue中的options就是一个大对象,导致js本身的很多检测都失效了,比如一个函数没有用到的话会“变灰”,template中代码提示比较少,较多的mixins等等;遇到屎山代码,大多数人第一反应就是这谁写的代码这么差,其实大多数公司大多数...

weixin_46837985的博客 627
上一篇: 几天不写React,已经看不懂语法了
下一篇: 你安装的 NPM 包,可能偷偷在做坏事
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值