`
apusiczhang
  • 浏览: 16939 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

IoVC,一种新的编程思想

阅读更多

IoVC——“Inversion of View-Control”,即“视图控制反转”,换言之:它能够把对“View(即 UI 视图)的控制力”注入到你的后台业务逻辑中。这样一来,你在编写业务逻辑的过程中,对 View 拥有足够的控制力,从而能够将展现层与业务逻辑完全的解耦。

 

举一个场景:页面中有一个文本输入框,它的值对应后台的一个JavaBean的属性。我们首先来看一下传统的编程模型:

 

页面:
<w:textField value="#{myBean.value}"/>
后台:
public class MyBean {
    private String value;
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

 

此时,假设用户需要发生变化,我们需要设置文本输入框的tooltip,并且,它的值来自于后台 JavaBean 的另一个属性,那么,程序需要做如下调整:

 

页面:
<w:textField  value="#{myBean.value}" tooltip="#{myBean.tooltip}"/>
后台:
public class MyBean {
    private String value;
    private String tooltip;
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }    public String getTooltip() {
        return tooltip;
    }
    public void setTooltip(String tooltip) {
        this.tooltip = tooltip;
    }
}

 

我们可以观察:在传统的编程模型下,如果页面逻辑发生变化,我们首先需要修改UI展现层,加上 tooltip="#{myBean.tooltip}" 的语句,然后,再在后台Bean中设置此属性值。

那么,在IoVC编程模型下,情况又是怎样的呢?

 

页面:
<w:textField id="txt"/>
后台:
public class MyBean {
    @Bind(id="txt")
    private String value;
}

 

如果需要扩展文本编辑框的tooltip属性,只需要:

 

页面:
<w:textField id="txt"/>
后台:
public class MyBean {
    @Bind(id="txt")
    private String value;

        @Bind(id="txt" att="tooltip")
    private String tooltip;
}

 

在IoVC编程模型下,Web页面不需要发生任何变化,你只需要在后台 Java Bean 中写上这样一行属性声明即可@Bind(id="txt" att="tooltip") private String tooltip,甚至于你连传统的getter/setter都不需要。

 

换言之,在传统的编程模型下,页面美工通过网页设计工具“画”出来的页面,程序员看不懂; 而如果程序员对页面进行修改,则页面美工又无法理解; 并且,如果要更改业务逻辑,程序员需要不断的维护页面内容,最终造成页面美工与程序员无法协同工作。而在 IoVC 的编程思想下,页面美工只需要给每个组件设置一个ID,程序员在后台的业务逻辑中,便拥有对页面 UI 元素的完全控制力。Web页面在美工完成之后,程序员再也无需因为需求的变更或者逻辑的变化,而再重新维护 Web页面内容。

 

简而言之,IoVC是一种更好的MVC,是对MVC的一种高层次抽象。

 

设想一下:日后美工人员画出来的页面(只要设置了正确的ID),程序员可以拿过来直接用,并且, 如果要对页面做调整(只要不是页面元素的增加或删除),程序员可以在自己熟悉的代码中直接设置,这岂非是一种很享受的境界?

 

更多技术文章,请见:http://www.operamasks.org/

 

分享到:
评论
48 楼 apusiczhang 2008-03-27  
robbin 写道
upheart 写道
引用
页面美工只需要给每个组件设置一个ID,程序员在后台的业务逻辑中,便拥有对页面 UI 元素的完全控制力。
程序员可以拿过来直接用,并且, 如果要对页面做调整(只要不是页面元素的增加或删除),程序员可以在自己熟悉的代码中直接设置,这岂非是一种很享受的境界?


其实wicket之类的框架早就是这样了,而且页面还是纯html的,更利于和美工合作——既然金蝶的OperaMasks都把JSF改成这个样子了,为什么不再彻底一点,像Wicket、Tapestry直接用html而不是jsp的taglib呢?

OperaMasks做到现在这个样子还是很值得肯定的。

至于IoVC,我看还算不上什么编程思想,更不是什么新东西。


没错,我也是这种感觉。看看现在Warp-MVC就知道,IoVC早已经不是新鲜玩意,当然到这个词造的还不错。老实说还不如扔掉JSF这个包袱、大胆的走模板语言、Annotation的路。


To Robbin兄:
    1) 模版语言:OperaMasks 已经在路上,那就是 Facelets。
    2) Annotation:在 OperaMasks 2.0中,已经大量运用了 Annotation。Robbin兄人在上海,套用上海的一句方言是:“Annotation不要太多哦。”
    3) JSF:我们站在JSF规范之上,取之精华,弃其糟泊。我们克服了许多JSF规范中不尽人意的地方,如对状态的维护,但同时,吸取了JSF大量的精华所在,如:组件模型、生命周期等等。但至于是否完全彻底的抛弃JSF,坦白说,我们也正在思考。

47 楼 hyhongyong 2008-03-27  
apusiczhang 写道
pig345 写道

再具体的:你为什么不能在当用户输入某些不合法的字符给这个字段的时候,(在后台判断完成后,产生返回页面时),在这个字段上加上class='invalided_field'呢?
在css定义中完全可以在不同的界面方案(我说的皮肤)中,定义不同的.invalided_field{},从而使用不同的颜色/外框/背景色等等。。。

多多利用web本身提供的灵活性不是更好?

有时候解决问题不要太急于看实现,退一步,抽象点会获得很多灵活性,这种思考方式对框架作者尤其重要阿。


你说的对,一定要充分利用Web本身提供的灵活性。
但现在的问题并不是强调是用style,或者styleClass,还是说把 style 或 styleClass 的内容放在页面中还是放在后台 Bean 中的问题,笔者一直想强调的是:假设style或者styleClass都已经定义好了(且不论它是定义在哪里),那么,如何根据用户的输入,来更改UI的表现。
IoVC,让你拥有了一种能够在后台Bean中影响UI表现的能力。
仅此而已。


这种在后台影响UI表现的能力,还是不要有的好!
46 楼 apusiczhang 2008-03-27  
pig345 写道

再具体的:你为什么不能在当用户输入某些不合法的字符给这个字段的时候,(在后台判断完成后,产生返回页面时),在这个字段上加上class='invalided_field'呢?
在css定义中完全可以在不同的界面方案(我说的皮肤)中,定义不同的.invalided_field{},从而使用不同的颜色/外框/背景色等等。。。

多多利用web本身提供的灵活性不是更好?

有时候解决问题不要太急于看实现,退一步,抽象点会获得很多灵活性,这种思考方式对框架作者尤其重要阿。


你说的对,一定要充分利用Web本身提供的灵活性。
但现在的问题并不是强调是用style,或者styleClass,还是说把 style 或 styleClass 的内容放在页面中还是放在后台 Bean 中的问题,笔者一直想强调的是:假设style或者styleClass都已经定义好了(且不论它是定义在哪里),那么,如何根据用户的输入,来更改UI的表现。
IoVC,让你拥有了一种能够在后台Bean中影响UI表现的能力。
仅此而已。

45 楼 pig345 2008-03-27  
apusiczhang 写道

首先请"pig345"兄再观察一下笔者的语句:我并不认为将style放到后台Bean是最佳解决方案。
但同时,也请"pig345"兄考虑这样一个问题:(我的这个场景举的可能也有问题,但时间紧,一时半会想不到更合适的场景)
假设用户需要这样一种场景,在某个textField中,当用户输入某些不合法的字符,字体颜色变成红色,否则,字体颜色是蓝色。
并且,对这些字符是否合法的判断,需要到数据库中进行查询对比。
请问,这种场景,怎样解决最合适呢?

再回到楼主关于换肤的话题,何谓换肤?是指不影响用户业务逻辑的情况下,自由的更改应用系统的UI风格。
但上面的这个场景,它已经不是“换肤”所能解决的问题,这个场景本身就是用户的一种逻辑。


再具体的:你为什么不能在当用户输入某些不合法的字符给这个字段的时候,(在后台判断完成后,产生返回页面时),在这个字段上加上class='invalided_field'呢?
在css定义中完全可以在不同的界面方案(我说的皮肤)中,定义不同的.invalided_field{},从而使用不同的颜色/外框/背景色等等。。。

多多利用web本身提供的灵活性不是更好?

解决问题不要太急于看实现,退一步,抽象点会获得很多灵活性,这种思考方式对框架作者尤其重要阿。
44 楼 pig345 2008-03-27  
不过给出的例子确实不能体现你所说的这些,希望是如你所说吧,不过要照顾到较多情况,可能本身也不比其他框架省多少了。

----------
这个省是指:简单,容易理解,且在框架没考虑到的情况下,不需要为克服框架写一些费解的代码。
43 楼 apusiczhang 2008-03-27  
pig345 写道
再具体到刚才的style的例子,其实怕是更加思路不清了。
当前的web基本上都要走DIV+CSS的路子,CSS的麻烦不比javascript少(相对于以前的table布局,抽象不直观,又有跨浏览器的问题,当前的2.0还有些限制不能100%随意布局),但是有一个好处就足以让我用它了,那就是可以让web随意换肤,而只要改动一行html就行了!
看看刚才的例子,如果都把style写到java code里面了,还怎么作网站换肤?
必将是这样一种情况:界面的些许改动,都导致java的代码变动(要重新编译,重新部署),这就是不遵循前人经验的恶果吧。

----------

口气有点重,希望是良药吧。


首先请"pig345"兄再观察一下笔者的语句:我并不认为将style放到后台Bean是最佳解决方案。
但同时,也请"pig345"兄考虑这样一个问题:(我的这个场景举的可能也有问题,但时间紧,一时半会想不到更合适的场景)
假设用户需要这样一种场景,在某个textField中,当用户输入某些不合法的字符,字体颜色变成红色,否则,字体颜色是蓝色。
并且,对这些字符是否合法的判断,需要到数据库中进行查询对比。
请问,这种场景,怎样解决最合适呢?

再回到楼主关于换肤的话题,何谓换肤?是指不影响用户业务逻辑的情况下,自由的更改应用系统的UI风格。
但上面的这个场景,它已经不是“换肤”所能解决的问题,这个场景本身就是用户的一种逻辑。
42 楼 xxjhappy 2008-03-27  
lucky12345 写道
举的例子太狭窄,看不出有什么好的地方
后台本来是管理数据的,现在还要来管理前台显示,已经违背了MVC的思想了


人家楼主已经说了:IoVC让你具备了业务逻辑和UI之间双向交互的能力,但人家并没有让你把什么需要前台显示的东西放到后台来啊。
41 楼 lucky12345 2008-03-27  
举的例子太狭窄,看不出有什么好的地方
后台本来是管理数据的,现在还要来管理前台显示,已经违背了MVC的思想了
40 楼 apusiczhang 2008-03-27  
pig345 写道
具体点说,这类东西在很多公司内部都有有想法的人做过,
我见过另外的一个私有框架,完全是根据数据库结构生成中间层和表现层代码模板,可以做到数据库字段如果是not Null 的,html表单中就会自动加*显示,提交时自动判定必添字段给予提示...
这个东西不是更省?对于简单的CRUD程序,每次修改时,改改数据库定义重新生成一遍代码,基本OK了。
但是有很大的推广意义么?它只适用于很窄的范围,如果遇到意外情况,就必须修改框架来适应(框架本身不具有广泛性和稳定性),而除了框架作者,其他人恐怕也很难在这种情况下快速修改和调整。


确实,很多私有框架在解决某些特有问题的场景下,会更方便,笔者也见过许多。
同样,笔者对这些私有框架也并不感冒,究其原因,无非:
1) 这是一种强制性的框架,你只能选择Yes或No。而一旦你选择No,就意味着框架带给你的好处全都不见了。
2) 这是一种约束性的框架,只能解决某些特定场景下的特定问题,一旦你试图将这些场景扩大,你会发觉,
框架会给你这样或那样的限定条件。
但IoVC则不同:
1) IoVC不是强制性的,你完全可以利用它,你也可以抛弃它。IoVC并没有阻断你解决同样问题的其它途径。
2) IoVC是一种相对而言比较"general"的解决方案,它不会限制你必须要遵守什么约束。
再次重申:IoVC使你具备了一种UI和业务逻辑双向影响的能力,但你怎么用,在什么场景下用,则是仁者见仁智者见智了。
39 楼 pig345 2008-03-27  
再具体到刚才的style的例子,其实怕是更加思路不清了。
当前的web基本上都要走DIV+CSS的路子,CSS的麻烦不比javascript少(相对于以前的table布局,抽象不直观,又有跨浏览器的问题,当前的2.0还有些限制不能100%随意布局),但是有一个好处就足以让我用它了,那就是可以让web随意换肤,而只要改动一行html就行了!
看看刚才的例子,如果都把style写到java code里面了,还怎么作网站换肤?
必将是这样一种情况:界面的些许改动,都导致java的代码变动(要重新编译,重新部署),这就是不遵循前人经验的恶果吧。

----------

口气有点重,希望是良药吧。
38 楼 pig345 2008-03-27  
具体点说,这类东西在很多公司内部都有有想法的人做过,
我见过另外的一个私有框架,完全是根据数据库结构生成中间层和表现层代码模板,可以做到数据库字段如果是not Null 的,html表单中就会自动加*显示,提交时自动判定必添字段给予提示...
这个东西不是更省?对于简单的CRUD程序,每次修改时,改改数据库定义重新生成一遍代码,基本OK了。
但是有很大的推广意义么?它只适用于很窄的范围,如果遇到意外情况,就必须修改框架来适应(框架本身不具有广泛性和稳定性),而除了框架作者,其他人恐怕也很难在这种情况下快速修改和调整。
37 楼 apusiczhang 2008-03-27  
pig345 写道

支持,真正理解原理的人都会有此结论。
再次提醒下,不要打着MVC的旗帜,实际却作的反MVC模式阿。浪费时间精力。


我再举一个场景:
假设我们的应用系统需要支持中文和英文两种语言。诸所周知,由于中英文的差异,会导致UI的表现也会有差异。
举个简单的例子,倘若我们有一个Label,中文下,它显示:"请输入姓名",而在英文下,显示"Please input your name"
换言之,中文下,这个Label的长度为100,而英文下,它的长度要为200才能够将字符显示完全。
这种问题如何解决?
在IoVC下(确切的说是在OperaMasks 2.0下),我们可以直接在资源文件中这样定义:
#LocalStrings_zh_CN.properties
SomeBean.labelId.width=100

#LocalStrings_en_US.properties
SomeBean.labelId.width=200

然后,我们无需再做任何事情,IoVC会自动帮助我们进行lable长度的调整。

这种解决方案无疑是非常自然的,或者套用目前的流行词汇,是非常“和谐”的,而我们的维护成本也很低。

那么,传统的、常规的解决方案是怎样的?
首先,依然要定义资源文件,
然后,在页面中引入这个资源文件,
<f:loadBundle basename="messages1" var="msgs" />
最后,在Label的定义处这样写:
<label width="#{msgs.SomeBean.labelId.width}"/>

哪种方案更优雅一些呢?
36 楼 pig345 2008-03-27  
之所以前人总结归纳了那么多的方法、原则、模式、架构,就是避免出问题的,当然随之而来的是较高抽象度和实现复杂度。

现在如果为了实现的方便有意违反的话,也大可不必打着这些模式的旗号,会误新人的。

这样明显的有意违反,其实可能是换取在某些特殊情况下的方便(如你所说,可能让客户感到非常满意),但是不见得能大力推广吧?(这样的便捷一般都是在特定情况下,一旦超出带来的就是麻烦了)
35 楼 apusiczhang 2008-03-27  
jassonzou 写道
不敢苟同啊。在domain模型控制UI?这是MVC还是MV啊?
按你前面的介绍,应该是控制层才合理。
MVC的目标就是解耦,可你公司的IoVC看起来不像啊,而是越来越耦合了。


这要看你怎么理解MVC。

我是这样看待MVC的:MVC的最终目的是让我们的程序结构分层解耦,从而让应用系统的可维护性及可扩展性增强,而将程序结构分成Model、View、Control,只是一种手段,而不是我们的最终目的。

在带有界面的应用系统中,UI和后台逻辑之间的双向交互,无疑是必须的一种基本能力。

IoVC,使你具备了这样一种双向的能力,但这种能力怎样运用,用在什么场合,则需要具体场景具体分析。

记得我曾经给客户演示过这样一种场景:
当用户在某个textField中输入了一个错误的字符,用户希望让textField的字体变成红色。那么,在IoVC下,我们可以这样做(假设textField的id为abc):
在后台的ManagedBean中,声明一个变量:

@Bind(id="abc", attribute="style")
private String txtStyle = "color: red";

如此一来,我们可以在不更改页面的情况下,满足用户的需求。
但这样做是否就是最佳方案?
笔者看来,也未必。因为类似于 style 的这种东西,确实是应该放在 UI 层,而不应该放在后台代码中的。

再次重申:IoVC,只是让你具备了这种能力,但具体怎么运用,需要具体场景具体分析。
34 楼 pig345 2008-03-27  
jassonzou 写道

不敢苟同啊。在domain模型控制UI?这是MVC还是MV啊?
MVC的目标就是解耦,可你公司的IoVC看起来不像啊,而是越来越耦合了。

支持,真正理解原理的人都会有此结论。
再次提醒下,不要打着MVC的旗帜,实际却作的反MVC模式阿。浪费时间精力。
33 楼 jassonzou 2008-03-27  
apusiczhang 写道

    而IoVC,则是一种双向的解决方案,它即帮助你把用户输入组装成你的domain模型,同时,你在domain模型中,还拥有对UI元素的控制力,无疑,这是一种更好的MVC。

不敢苟同啊。在domain模型控制UI?这是MVC还是MV啊?
按你前面的介绍,应该是控制层才合理。
MVC的目标就是解耦,可你公司的IoVC看起来不像啊,而是越来越耦合了。

32 楼 huangwei_joy 2008-03-27  
例子举的太狭窄了...
31 楼 lonlyleo 2008-03-27  
这种标签不太喜欢,我喜欢jodd-form这种的,套一个tag就行了.

我现在越来越倾向用比较老而原始的东西,比如页面就是HTML+js,再加上一些jsp必须的东西,觉得对这些东西的包装越少越好;
想给一个input增加一个属性操作dom不也是易如反掌么?后台么,反正增加一个属性也是要作修改的.

我已经患上了框架/思想恐惧症.要说这IoVC是一种解决某种问题的实现方案可能还好一点.大词时代还没过去么?
30 楼 stone 2008-03-27  
还在谈页面吗?我们已经开始进入到组件化的web开发时代了。拿GWT来说,我们可以把javabean直接和UI进行binding(ui数据发生变化,邦定的java bean也跟着变化),不需要IOVC。更有甚至,在gwt的支持下,我们都可以在UI中直接使用pojo,异步加载lazy 属性。UI很复杂,web的UI更是难以调教,但是关键点不是和业务调用的集成,而是本身所面对用户时,用户所提出的千奇百怪的用户界面和用户体验。
29 楼 apusiczhang 2008-03-27  
    传统的GUI编程中,也就是我们所谓的"C/S"架构下的程序开发中,我们对"展现层与逻辑层分离"这个问题,感触并不是那么强烈,究其原因,是因为你的展现层和逻辑层,都用同一种语言开发,你在UI中可以任意的调用业务逻辑代码,而你在业务逻辑中,也可以很轻松的对UI进行各种更改,于是,C/S架构下的MVC更容易理解,符合我们的常规思维。
    但在B/S架构下,展现层已经注定是HTML,这是一种纯粹的UI描述型语言,而我们的业务逻辑则可能是Java,或C#等常规意义上的程序语言,于是,这两者之间出现了一个鸿沟,而为了弥补这个鸿沟,我们不得不在HTML中混入大量的程序代码片断,来调用业务逻辑及动态拼凑HTML(更改UI),而这样做的缺陷是显而易见的,那就是:程序的可维护性及可扩展性太差。
    于是乎,就出现了所谓的Web层的"MVC"架构,但大部分这类的MVC框架,做的最主要的工作是帮助我们把UI层的数据组装成对象模型JavaBean,再通过JavaBean和业务逻辑进行交互。但这类解决方案,存在一个问题:这是一种单向的解决方案,只解决了根据用户输入调用业务逻辑的问题,但倘若你还需要由于业务逻辑的变化而对UI进行改变,那么,你不得不另觅他径。
    而IoVC,则是一种双向的解决方案,它即帮助你把用户输入组装成你的domain模型,同时,你在domain模型中,还拥有对UI元素的控制力,无疑,这是一种更好的MVC。
    当然,IoVC的这些思路与想法,还有待实践的检验,请给我们以时间,让我们做得更好。

相关推荐

    OperaMasks快速进阶

    OperaMasks是一个开箱即用的Web开发解决方案,它的关键特性包括IoVC的编程思想,使得页面设计与控制逻辑分离。此外,它还内置了Ajax支持和丰富的UI组件库,适合开发高交互性Web应用和轻量级、高并发的Web站点。...

    机械原理课程设计 破碎机.doc

    机械原理课程设计 破碎机.doc

    电子设计论文施密特触发器电子设计论文施密特触发器

    电子设计论文施密特触发器电子设计论文施密特触发器

    电子设计论文往返式流动灯电子设计论文往返式流动灯

    电子设计论文往返式流动灯电子设计论文往返式流动灯

    基于深度学习来实现序列到序列.zip

    深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。

    美国扩大电动汽车充电基础设施政策(英文).pdf

    政策背景与动机: 签署法案:2021年11月15日,拜登总统签署了《基础设施投资和就业法案》(IIJA),旨在通过多项措施推动美国电动汽车充电基础设施的扩张。 市场增长:随着电动汽车市场的快速增长,对充电基础设施的需求也日益增加,政府政策成为推动这一发展的关键力量。 电动汽车充电基础: 充电技术:电动汽车充电技术通常分为三级,各级充电速度和功率不同,满足不同场景下的充电需求。 充电站类型:包括公共、私人及工作场所充电站,各自具有不同的访问限制和使用特点。 市场趋势与现状: 市场增长:EV市场增长依赖技术进步、成本降低及充电便利性的提高。 充电站数量:截至2022年10月,美国公共和私人充电站总数超过50,000个,其中93%为公共充电站。 区域差异:充电站分布存在地区差异,部分低收入社区充电基础设施不足。 政策与项目: NEVI公式计划:通过IIJA设立的国家电动汽车基础设施(NEVI)公式计划,为各州提供资金以建设EV充电站。 税收抵免:扩展了替代燃料汽车加油站的税收抵免政策,包括EV充电站,以激励投资者。 联合办公室:DOT和DOE成立联合办公室,负责NEVI计划的实施和监管,确保

    电子设计论文照明过暗提醒电路电子设计论文照明过暗提醒电路

    电子设计论文照明过暗提醒电路电子设计论文照明过暗提醒电路

    前端,HTML+CSS的综合案例,网页开发

    我选用的软件是:Visual Studio CODE,这个软件在前端开发中十分常用,且提供了很大的便利。 当然也可以用记事本开发,记得把后缀名改成.html 还有我的CSS使用的是内部样式表。 写在head标签下。用到的标签有  <h1></h1>    <img src="lyf.jpg" class="god">     <p>    </p> 就是这三个标签,构成了HTML的主体架构。 而CSS则是设置了以下形式。 font-size: 16px;             line-height: 32px;             font-family: "Microsoft Yahei";             text-align: left;             text-indent:2em;          text-decoration: none;             color: #888888         width:66px

    MFC MAPI 源码和可执行文件

    大名鼎鼎的MFC MAPI 源码和可执行文件,是开发OUTLOOK插件的好帮手。

    机械原理课程设计插床机构机械设计.doc

    机械原理课程设计插床机构机械设计.doc

    基于深度学习的音频分类 前端App.zip

    深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。

    基于BERT模型的深度学习中文文本分类实现,包含大约20000条新闻的训练和测试集,包装有简单HTTP接口可供调用。.zip

    深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。

    《化工设备机械基础》课程设计 IB储罐设计.doc.doc

    《化工设备机械基础》课程设计 IB储罐设计.doc.doc

    机械原理课程设计网球自动捡球机.doc

    机械原理课程设计网球自动捡球机.doc

    EKFUKFCKF录屏.mp4

    EKFUKFCKF录屏.mp4

    仿新浪读书小程序源码学习

    仿新浪读书小程序源码学习

    基于科大讯飞AI营销算法比赛实现CTR深度学习方法.zip

    深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。

Global site tag (gtag.js) - Google Analytics