太阳系,我们知道多少?

它位于猎户座臂, 距离银河系中心 26, 000 光年。
这个系统的绝大多数质量都属于太阳, 而木星则是太阳系其它七大行星质量总和的2.5倍。
在直接围绕太阳运行的天体中, 最大的是八大行星, 其余的则是
【菜科解读】
太阳系八大行星
太阳系是由受到太阳引力约束的行星和直接、间接围绕太阳运行的天体所组成的行星系统,是46亿年前由一个巨大的星际分子云的引力崩塌而形成的。
它位于猎户座臂, 距离银河系中心 26, 000 光年。
这个系统的绝大多数质量都属于太阳, 而木星则是太阳系其它七大行星质量总和的2.5倍。
在直接围绕太阳运行的天体中, 最大的是八大行星, 其余的则是较小的天体。
如五颗矮行星和小型天体,在间接绕太阳运行的天体中,有两个卫星要比最小的行星——水星大。
水星、金星、地球和火星这四个较小的内行星是类地行星, 主要由岩石和金属组成。
四颗外行星是巨大的行星, 其质量大大高于类地行星。
木星
土星
木星和土星这两个最大的行星是气体巨行星, 主要由氢和氦组成。
太阳系最外层的两个行星:天王星和海王星, 它们属于冰巨星。
主要由相对较高的熔点组成的物质如氢和氦组成, 以及少量的水,氨和甲烷。
所有八颗行星几乎都有圆形的轨道, 位于一个叫做黄道的几乎扁平的圆盘内,朝同一方向围绕太阳公转。
太阳系也包含较小的物体。
位于火星和木星轨道之间的小行星带, 主要由包含岩石和金属的物体组成, 如类地行星;在海王星的轨道之外是由主要由冰封物体组成的柯伊伯带和离散盘。
小行星带
在这些天体中, 有几十到几万个足够大的物体,这些物体被归类为矮行星。
已确定的矮行星包括小行星谷神星以及阋神星和冥王星。
除了这两个区域外, 其他各种小天体 包括彗星、半人马和星际尘埃云, 都可以在不同区域之间自由移动。
奥尔特云则被认为是长周期彗星的来源, 是一个包围太阳系的球体云团,距离太阳约50000~100000个天文单位。
关于大型asp.net应用系统的架构-架构的选择
之前和同事们聊天的时候说的都是一些思维片段,其中的想法不尽完善,聊完天再仔细想想,一些主意就逐渐清晰了。
现在终于付诸行动了,将一些想到的主意与大家一起探讨,也算是对过去几年在ASP.NET方面的一个总结。
这对我来说也是一个学习过程。
博客园有不少同仁在写系统架构或者企业应用架构方面的文章,我看过其中一些。
就我看过的这些文章,我发现他们当中相当多的人写的是分层架构。
从我的看法来说,分层是不错。
但是如果是我自己写的话,我会从架构的选择来说起。
那么应用程序的架构就有可能不选择分层的架构,而选择其他架构。
另外我会从整个系统的角度来写,即从硬件和软件两个角度来思考一个系统。
这些都是我的一些建议,希望对您有所帮助。
简介 大型asp.net应用要考虑如何服务众多的访问者,同时还要保证每个访问者都获得高质量的服务。
需要面对不同语言的用户;需要保证安全性;应用系统的伸缩性也是很强的,当服务器集群有点不足以担负压力时,可以向服务器集群中加入更多的服务器来增加整个应用系统的服务能力。
服务器的可用性也会要求很高,一年的下线时间是很少的。
服务器的灾难备份也是很好的,即使现在的机房遭受毁灭性打击,也有灾难备份可以恢复服务。
服务器上跑的asp.net应用是可扩展的,具有很好的可扩展性,同时具有良好的可维护性。
本系列文章将谈谈大型asp.net应用系统架构的诸多方面。
本篇将谈到架构的选择。
架构的选择架构的选择与应用程序的类型有关。
这里说的是asp.net应用,那么Client-Server的架构就很显然排除了。
剩下:基于组件的架构应用可以按组件划分,不用组件实现不同功能和逻辑,组件之间的接口规范有很好的定义。
某些组件可以重用。
分层Layered的架构应用被划分成了堆叠在一起的若干层,每一层完成特定的服务和功能,与其上下层接口,各层之间是调用被调用的关系。
在最上面的层只有调用下面的一层,在中间的层则兼有调用和被调用。
在最下面的层则是仅供上面的层调用。
通常划分成UI层,商务逻辑层,数据层等,并且通常多个层都部署在同一台服务器上。
消息总线型的架构应用程序按照预定义的格式来收发消息。
有一个消息队列和消息存储,分发处理的任务。
相关消息的事件被程序处理。
支持不同的系统平台。
消息总线里面有若干定义好的消息流,消息总线同各系统平台交换数据,支持不同的格式。
将消息交由不同的处理程序处理。
Model, View, Controller(MVC)架构用户交互的处理与UI显示分离用户交互的处理和UI显示与数据分离 3Tier/N Tier的架构Tier可以译成排。
以与Layer(层)有所区别。
将应用程序划分成一系列的服务,包括UI, Business(商业逻辑), 数据等服务。
各Tier可部署在不同的服务器上。
类似于分层(layer)的架构。
通常分层(layer)不跨机器的边界,也即所有层(layer)都部署在一台服务器上。
Tier是要跨机器的边界。
各Tier之间用预定义的通信协议来通信,如WCF, Web service, 或者TCP/IP等。
分层(layer)的各层(layer)之间的通信都是通过该编程语言的引用和调用来实现的。
所以是有区别的。
面向对象的架构应用可以划分成自给自足的可重用的对象集合,对象包含了数据和行为。
各对象之间有消息交互。
面向服务的架构应用使用一个功能是通过调用一个服务。
在服务提供者和调用者之间有通信合同和消息,通信合同定义了消息的格式和通信的方式。
消息则包含通信的内容。
面向服务的架构是“请求-响应”的工作模式。
应用程序是以一种服务提供的,调用者需要向服务发送预定义好的请求消息,服务才做出响应。
这些架构类型都可以用来开发asp.net应用。
我们可以从其中选择架构类型的组合来,比如:分层Layered的架构 + 面向服务的架构。
MVC架构 + 消息总线型架构。
具体的选则,取决于应用程序的要求。
现在说一下如何选架构:如果有若干现成组件,比如以前系统的ActiveX组件或者.net的组件应用程序足够简单而不需要分层的架构,通过调用这些组件就可完成大部分工作不同语言开发的组件需要结合在一起,如ASP.net需要调用VB写的COM+的组件应用程序需要支持插件技术,可以动态切换组件,例如用.net反射技术实现的插件技术 那么我们可以选择基于组件的架构。
如果应用程序比较复杂,不同的功能需要不同的层来各司其职,如数据访问,商务逻辑,表现等。
有比较复杂的商务逻辑和流程。
那么我们可以选择分层的架构。
如果有若干已有系统并且这些系统之间有特定的交互需要让一个系统与外部的其他系统交互不同平台上的系统相互之间进行交互 那么我们可以选择消息总线型的架构如果要获得分离的UI视图和处理逻辑要UI视图和处理逻辑与数据存储分离 那么我们可以选择Model,View,Controller(MVC)架构如果应用全部在内部网里应用在互联网上,同时商务逻辑需要暴露给公众使用商务逻辑足够复杂,需要专门的服务器来提供商务逻辑服务。
应用程序比较复杂,不同的功能分布在不同的服务器上,每一种功能,都可能是由一组服务器来提供。
那么我们可以选择3 Tier/N Tier架构如果相关商业领域有足够多的现实对象(这些对象通常是相关商务人员口中的名词),并且这些对象之间有交互应用比较复杂,需要更多的抽象对象的数据和行为都需要封装以利重用有足够的资源来做深入的面向对象分析,如时间,人力等。
那么我们可以选择面向对象的架构。
如果应用需要支持平台无关性多个应用程序的功能放进一个单一的界面来提供采用请求-响应模式运行需要开发软件加服务(Softwareplus service),软件即服务(Software as a service)类型的应用,或者基于云计算的应用 那么我们可以选择面向服务的架构。
针对目前的场景:大型ASP.NET应用,那么它最基本的需求可能是这样的:同时访问的用户将会是相当多的,比如几千个,上万个。
7x24小时都有大量用户访问某些地方需要用户登录以获取一些需要授权才能获得的信息我们可能选择的架构组合可能是这样的:3Tier/N Tier的架构Model, View, Controller(MVC)架构结合3Tier/N Tier的架构3Tier/N Tier的架构结合面向服务的架构3Tier/N Tier的架构结合面向对象的架构当然也有可能是其他的组合。
分层Layered的架构不适合大型的ASP.NET应用。
分层Layered的架构通常将UI层,商务逻辑,数据访问层都部署在同一台服务器上,首先一台服务器不能负担众多的用户,还有复杂的商务逻辑不是一台服务器能全部担负的。
所以分层Layered的架构不适合大型的ASP.NET应用。
小型的ASP.NET应用才适合分层Layered的架构。
基于组件的架构也不适合大型ASP.NET应用。
通常来说大型的ASP.NET应用都是相当复杂的,它的UI界面,商务逻辑,数据都是复杂的。
不会简单到调用几个控件就完成了大部分的工作,大型的ASP.NET应用的每一个Tier排,都需要众多的服务器来分担压力,基于组件的架构的分布式能力有限,所以基于组件的架构是通常不会在大型ASP.NET应用里考虑的,除非是有若干个重要的控件,并且要考虑集成多个编程语言的控件时,才会考虑基于组件的架构。
而且是在某个局部使用,即需要与其他架构一起结合起来用。
消息总线型架构可以在某些场景下参与大型ASP.NET应用的开发。
通常是需要将多个系统平台整合在一起的时候。
消息总线型的架构需要结合其他的架构来共同构造ASP.NET应用。
MVC架构关注的更多的是UI,用户交互的控制以及数据存取的分离。
通常不能单独去构造一个大型的ASP.NET架构。
需要结合3Tier/N Tier架构来共同构造大型ASP.NET的架构。
MVC架构在UI还有用户交互上有固定的模式,所以可以在UI这一块应用MVC的架构,当涉及到MVC中的模型Model时,就可以扩展到3 Tier/N Tier的架构。
即在访问模型Model时,就去访问另外一个服务器上的商务逻辑和数据存储。
这个可以用下图来表示: 面向对象的架构是更多地关注应用里面的面向对象分析,设计等过程产生出来的结果。
这个结果体现了现实世界中的对象之间的交互作用。
面向对象的架构需要结合其他架构如3 Tier/N Tier架构来共同构造ASP.NET应用程序的架构。
面向服务的架构是在特定场景下需要的。
即上面所说的,多个功能作为一项服务,提供一个统一的UI给外界用户。
大型ASP.NET应用中通常需要将商务逻辑提供给公众访问。
这时就可以采用面向服务的架构。
面向服务的架构也需结合其他架构如3 Tier/N Tier架构来共同构造ASP.NET应用程序的架构。
3 Tier/N Tier架构对于大型ASP.NET应用来说是必须的。
它的每一Tier排都由若干服务器组成。
只有这样才可以服务众多的用户。
如上面的图所示,UI调用商务逻辑时得跨越机器的边界,调用另外一台服务器上的商务逻辑服务接口。
结束语 架构的选择需要根据不同架构的特点和应用程序的需求来进行选择,有时候需要用多个架构的组合才足以满足一个复杂应用的需求。
设计者需要根据实际情况来决定合适的架构选择。
关于,大型,asp.net,应用系统,的,架构,选择,最近,
关于OO中继承的思考-深度认识类,对象,内存分配
那么用这个指针可以调用privatePrint()函数吗?可以用这个指针可以调用成员cVar吗?答案是:不能。
那如果Parent中有一个虚函数privatePrint(),那么可以调用到privatePrint()吗?答案是:可以。
首先我用C++试了一遍。
C++的代码如下代码 1 #include 2 3 using namespace std; 4 5 class Prarent 6 { 7 public: 8 Prarent(){}; 9 int pVar;10 void print()11 {12 coutprint();38 // parent->privatePrint(); 编译通不过. 39 // 1: 说明父类的指针虽然指向了子类的对象, 但是却不能引用父类没有申明的函数.40 // 2: 但是你将privatePrint申明为父类的虚函数, 则上面的可以运行成功.41 }42 43 其实之前我没有怎么在意这个问题。
知道My sen Brother问了我。
我才发现问题并非简单。
经过了我们相互的讨论之后,我们得到了一种解释。
我不敢保证一定完全是对的。
但是却是我们自己的心得和体会。
理解这个问题。
首先要明白两个问题:1:类在内存是怎么存放的?(编译阶段实现)2:对象实例在内存中是怎么存放的?1:类在内存是怎么存放的?我根据以前Teacher Lei说过的一些内容,计算机组成,汇编语言,自己看过一些书,得到自己的一种思考。
其中一个类,通过编译分别存在内存的两块地方,一个是代码段,一个是数据段;代码段存放一个类的成员变量;(ie. 上面的pVar和cVar都是存放在代码段中)数据段存放一个类的成员函数表;(ie. 上面的print()和privatePrint()都存放于这里);数据段中的每一个类的内存块应该由两个表填充,一个为虚函数表,一个为非虚函数表;数据段中类的成员变量存放,如下:int pVarint cVar代码段中类的成员函数表存放,如下: Parent()Print()Child()Print()pravtePrint()下面来解释 2:对象实例在内存中是怎么存放的?我们拿上面的例子来说明:当初始化一个Parent *parent 一个指针对象时,这时候parent所指向的地址就是100;vPtr(虚函数指针) 地址:100int pVar当初始化一个Child类型 child 对象时,这时候child的地址就是200;(注意和指针不一样)vPtr(虚函数指针) 地址:200int pVarint cVar首先:为什么这边一定是这样排列的还记得Teacher Lei说过吗?原因:子类在初始化的时候是先调用父类的构造函数!!说明父类的成员一定是先被初始化的。
所以这边的结构必然是这样的。
(这里很重要)好了。
到现在基本就把要知道的基础知识解决了。
不知道读着博客的人累了没有。
。
呵呵。
后面的更精彩。
现在 把child对象的地址赋值给指针parent(即 parent = &child)先来看看 parent->cVar 为什么不行?! 第一步:parent->cVar 其实是一个地址的偏移过程,现在parent的地址是200;那么cVar就代表2个偏移量;按说电脑是可以找到202的这个地址的值。
可是为什么不行呢?第二步:在程序的编译过程中,每一个的成员函数名都被当做一个偏移量。
就像这里,pVar代表量1个偏移。
cVar代表2个偏移量。
第三步:parent是Parent类型的。
这个很关键。
因为在编译的以后,parent已经初始化了一个最大偏移量max (这里的max为1)第四步:结果已经很明显了。
因为parent的最大偏移量max 为1。
程序根本找不着偏移量为2的变量地址。
然后看看 parent->privatePrint() 为什么不行?还是那个关键点。
parent是Parent类型的,还记得上面说类在内存中的加载方式吗?parent指向的是Parent的内存块。
所以在那个内存块中,根本找不着privatePrint()这个函数。
可是?有人因为会问了?为什么如果在Parent中申明了一个虚函数类型的privatePrint()就可以了呢?还记得类的实例在内存中加载的那个图吗?每个类的前面都有一个的vPtr虚函数指针,他指向的是当前类的虚函数表。
通过虚函数表中的privatePrint()也相当一个指针,指向了子类中实现父类虚函数的privatePrint(),自然就能找到了。
此时一切真相大白!! 关于,中,继承,的,思考,深度,认识,类,对象,