使用适配器模式设计RMI方式的网络应用程序

SpringBoot项目数据库密码加密实战:Jasypt 3.0.5集成与安全配置指南 在应用开发中,配置管理是连接代码与运行环境的关键环节,其核心在于如何安全、灵活地管理各类参数。传统方式将数据库密码、API密钥等敏感信息明文存放于配置文件中,存在严重的安全隐患。为此,业界引入了配置加密技术,其原理是在应用启动时对加密的配置项进行动态解密,确保敏感信息在存储和传输过程中始终处于密文状态。这项技术的核心价值在于,它实现了安全性与便捷性的平衡——开发者无需修改业务逻辑,只需通过标准化的加解密流程,即可有效防止敏感信息泄露。在SpringBoot生态中,Jasypt作为成熟的Java简化加密库,为 阅读详情
 

使用适配器模式设计RMI方式的网络应用程序

为网络应用编写本地Java对象指南

 

简介:

    使用Java的RMI方式编写基于网络的应用程序是非常简单的。然而,使用不是基于网络的类,而且还把它复杂化来为网络服务肯定不是一个好办法。这样做会使程序变得混乱、迟钝、难以阅读并且难以维护 。Dan Becker 论证了一种有效的将本地的Java类应用于网络的方法,这就是使用适配器设计模式( Adapter design pattern)。使用这种设计技术非常容易建立可维护性好,并且工作出色的应用程序。

    

    如果你曾使用过java的远程调用(RMI),你肯定知道那是很容易理解而且容易使用的建立远程对象和服务的方法。事实上,SUN的java教程里提供了一个优秀的例子来帮助你建立你的第一个RMI程序。但是 我也看到了一些建立在这个例子上的设计,这些设计因功能的增加而变得非常笨拙。不太熟练的程序员经常只能借助于一些约定来区分本地行为和远程行为。并且,随着新的远程服务加入,远程的对象在糟糕的网络交通中很容易变成一个大麻烦。

    在这篇文章里,我将会论证什么是适配器模式和适配齐莫是的使用技术。使用它区分本地行为和远程行为是非常简单的。并且你也能在非网络的应用程序中继续使用你的本地类。在远程服务增加的情况下, 使用这种设计模式很容易明白那些类必须处理请求,那些对象必须被同步。最后,使用这种技术,你的设计会变得更加容易理解,更加容易让更多的开发着修改和使用。

 

什么是适配器模式?

    适配器模式是结构化的模式之一,它出现在“四人组(Erich Gamma, Richard Helm, Ralph  Johnson, and John Vlissides)”编写的参考书《设计模式》中。适配器模式不仅仅适用于远程的C/S编 程,而且也适用于这种情况:你希望重用一个类,但是程序的接口不匹配这个类的借口。在这种情况下,你可以使用适配器或者封装器使应用程序的接口匹配已存在的类的借口。在软件开发中,一个适配器简单 的映射了其它的类的借口,它总是在开发过程中不断地被使用,最终变成了一种设计模式。

    图一说明了适配器是如何工作的。在这个图中,client想在接口Target中调用方法request()。由于 Adaptee类没有request()方法,把请求转化成为有效的匹配的方法就变成了适配器的任务。在这里适配器 把对方法request的调用转化成了对方法specificRequest的调用。适配器为每一个需要的方法做这种转变,就像封装器一样。

    图一

    这种适配类型恰恰正是一个想建立WEB远程服务的人想要的。你对外公布一个服务不是通过加入一个本地类,而是通过远程接口来适配本地类。我将在下面的部分想你解释这一切是如何做的。

设计一个基于网络的应用程序

    就像上面的部分所说的,通过把本地方法转化成远程接口所建立的类是最好的“WEB类”。SUN公司的 java教程已经告诉了我们使RMI工作必须遵守的步骤,这些步骤如下:

1 建立一个远程接口,它必须继承自java.rmi.Remote interface

2 提供一个远程接口的实现。  

3 在远程的客户端调用远程的方法。

很巧,这些步骤恰好匹配了适配器模式的功能。当远程客户端想使用被公布在远程接口中的方法时,适配 器模式被初始化,远程接口继承自java.rmi.Remote 以便让RMI知道这个接口实现了RMI,而不是把注意力 集中在实现远程方法的本地类上。通过调用在本地类中的简单方法完成了对远程服务的调用,而本地类没 有改变并且也察觉不到它已经可以完成网络请求的服务了。图二表示了应用适配器模式到RMI的类关系。

     图二

     从概念上说,我们已经建立了一个将适配器模式应用于RMI的程序图。现在,让我们完成一个具体的基于这种设计的实现。这个例子的功能是使许多远程的客户端查询、加入和删除元素。在这个例子中我会 使用the java.util 包中的哈西表类,许多程序员已经多次的使用过这个类了。

 

设计本地类

    建立远程Collection的第一布就是设计一个本地类来实现一些功能。这一步很方便,SUN公司已经为我们建立了Hashtable类,我们将使用这个类来完成一些功能。我忽略了同步这一概念,但是我会在后面 讨论线程安全使重新介绍它。为了方便,我在列表一中列出了哈西表类的一些相关方法。

列表一

int size();

boolean isEmpty();

boolean contains( Object value );

boolean containsKey( Object key );

Object get( Object key );

Object put( Object key, Object value );

Object remove( Object key );

void clear();

Enumeration keys();

Enumeration elements();

 

设计远程接口

    这个练习的第二步是建立一个远程接口,由它来公布网络的远程服务。接口RemoteMap是建立在 java.util.Map 上的collection接口,如下的这些方法框架式远程的客户端能够调用我们的网络哈西表。

public interface RemoteMap extends java.rmi.Remote {

   // Constants

   public static final String SERVICENAME = "RemoteMap";

 

   public int size() throws RemoteException;

   public boolean isEmpty() throws RemoteException;

   public boolean containsKey( Object key ) throws RemoteException;

   public boolean containsValue( Object value ) throws RemoteException;

   public Object get( Object key ) throws RemoteException;

   public Object put( Object key, Object value ) throws RemoteException;

   public Object remove( Object key ) throws RemoteException;

   public void clear() throws RemoteException;

}

列表二 远程接口中的远程方法

有一些细节由必要指出,所有的远程方法都要抛出java.rmi.RemoteException,这是不用担心的,这是 Java的RMI的一个简单的要求;而且,RemoteMap 接口必须继承自java.rmi.Remote ,这是一个标志,它 告诉Java的rmic工具这个接口准备在网络上共享,这是RMI的另一个要求。在这个接口中还有一个常量字符串SERVICENAME,当服务器公布RMI服务和客户端查找服务的名字时这个字符串会很有用。

    所以,现在我们有了一个本地对象和一个远程的接口,我们现在准备为远程接口写适配器类。

   

容易犯的错误

    许多社记者在进入下一步时出现了错误,这就是将本地类适应远程接口。通过继承Hashtable 类来生 成一个新的类并且实现远程接口这样的做法是很有诱惑力的,但是这是一个不好的变成选择,因为如下的 原因:

  · 使用组件而不是采取继承的方法来设计类是更好的办法。为什么呢?因为继承的设计通常是用来为存在的类加入新的方法和属性。而在这里,我们只是简单的把本地方法适配成为远程方法罢了,所以组件 设计会更加适合一些。

  · 继承设计会带来继承单独的父类这一问题。因为JAVA只允许单独继承,这就带来了扩展上的莫棱两可的选择,继承java.rmi.server.UnicastRemoteObject是RMI的要求,java.util.Hashtable在继承的设 计中也是必须继承的。干脆放弃继承的设计来实现RMI的功能吧。

  · 一些本地类是final的,它不允许被继承。例如,这个设计练习就不能用向量,因为向量类是final 的。如果一个类是final的,那么你就不能用继承设计。

  · 混合本地方法和远程方法会造成类的混乱,特别是当远程接口和本地类有相同的方法名时。我就曾看到一个解决方案中程序员们不得不改变方法的名字来防止这种情况的发生。例如sizeLocal和 sizeRemote,这多么难看啊!单独功能的类变成了一个巨大的复杂功能的类,多么可怕!

 

    为了向你说明生成一个适配器是多么的简单,列表三提供了全部的源代码。你看,适配器是多么简单得类,并且我们没有改变我们的本地实现。

public class RemoteMapAdapter extends UnicastRemoteObject

   implements RemoteMap {

 

   // Constructors

   // The owner publishes this service in the RMI registry.

   public RemoteMapAdapter( Hashtable adaptee ) throws RemoteException {

      this.adaptee = adaptee;

   }

 

   // RemoteMap role

   public int size() throws RemoteException {

      return adaptee.size(); }

   public boolean isEmpty() throws RemoteException {

      return adaptee.isEmpty(); }

   public boolean containsKey( Object key ) throws RemoteException {

      return adaptee.containsKey( key ); }

   public boolean containsValue( Object value ) throws RemoteException {

      return adaptee.contains( value ); }

   public Object get( Object key ) throws RemoteException {

      return adaptee.get( key ); }

   public Object put( Object key, Object value ) throws RemoteException {

      return adaptee.put( key, value ); }

   public Object remove( Object key ) throws RemoteException {

      return adaptee.remove( key ); }

   public void clear() throws RemoteException {

      adaptee.clear(); }

 

   // Fields

   protected Hashtable adaptee;

}

列表三 远程适配器类

    我们现在已经完成了这个例子练习的最重要的部分---我们已经写完了我们的适配器类。

 

 

最后的接触

    为了完成这个练习,我们还有点事情要做。第一,我们必须编译这个接口并且把适配器放在前面所说的两部分里。第二,我们必须为这个例子在网络上运行生成存根和骨架。这是由JAVA的rmic工具来完成的 。键入:rmic RemoteMapAdapter。

    接着,我们需要两个简单的程序来运行这个例子-----客户端和服务器端。首先,我们实现一个远程的服务器,它可以生成一个本地的哈西表并且公布我们设计的远程适配器接口。最重要的代码片断列在了 下边。它不像一些我见过的其他例子,这个例子可以通过createRegistry 方法来运行命令行注册这一步 。然后,我们生成了本地哈西表和使远程发布工作的适配器。最后,使用一个字符串和rebind 方法绑定 远程服务,服务器就开始运行,等待远程的客户端了。看列表四。

...

   try {

      System.out.println( "RemoteMapServer creating a local RMI registry on

the default port." );

      Registry localRegistry = LocateRegistry.createRegistry(

Registry.REGISTRY_PORT );

 

      System.out.println( "RemoteMapServer creating local object and remote

adapter." );

      adaptee = new Hashtable();

      adapter = new RemoteMapAdapter( adaptee );

 

      System.out.println( "RemoteMapServer publishing service /"" +

RemoteMap.SERVICENAME + "/" in local registry." );

      localRegistry.rebind( RemoteMap.SERVICENAME, adapter );

 

      System.out.println( "Published RemoteMap as service /"" +

RemoteMap.SERVICENAME + "/". Ready." );

   } catch (RemoteException e) {

      System.out.println( "RemoteMapServer problem with remote object,

exception:/n   " + e );

   }

   ...

列表四  服务器端程序片断

 

最后一步是生成一些客户端,他们可以加入、查询和清除远程的对象。列表五说明了客户端是如何发现在 服务器上的远程注册并且查询这些服务的过程。注意,lookup方法返回了RemoteMap 接口,而不是一个 RemoteMapAdapter 对象,在所有的RMI服务中都是这样的,因为远程的对象实现了远程的接口。

...

   try {

      System.out.println( "RemoteMapClient locating RMI registry on remote

host /"" + name + "/"." );

      Registry remoteRegistry = LocateRegistry.getRegistry( name );

 

      System.out.println( "RemoteMapClient looking up service /"" +

RemoteMap.SERVICENAME + "/"." );

      remoteMap = (RemoteMap) remoteRegistry.lookup( RemoteMap.SERVICENAME

);

   } catch (Exception e) { // expecting RemoteException, NotBoundException

      System.out.println( "RemoteMapClient problem with RemoteMap,

exception:/n   " + e );

   }

   ...

列表五 查找远程注册和远程的服务

 

我们曾看过RemoteMap的参考,可以调用任何在接口中的方法。事实上,远程方法调用和本地方法的调用 看起来恰好是一样的。有一点要注意,远程方法的调用会因为internet的交通问题而发生延迟。理论上这些调用应该放在不同的线程里确保本地java程序的正确。

列表六说明了如何调用远程对象。

...

   try {

      Object value = remoteMap.get( name );

      if (value != null )

         System.out.println( "RemoteMapClient found " + name + ", value=" +

value );

      else

         System.out.println( "RemoteMapClient could not find key " + name +

"." );

   } catch (RemoteException e) {

      System.out.println( "RemoteMapClient problem with " + name + ",

exception:/n   " + e );

   } /* endcatch */

   ...

 

 

为了使用这个C/S结构的系统,首先要启动服务器。服务器初始化了一个哈西表和远程的适配器,并把对 象放入哈西表。哈西表被RMI的本地注册机发布。在windows,unix或者OS/2的命令行输入:

 

java RemoteMapServer Harriet Bailey Max Zuzu

 

现在启动一个客户端查询和初始化远程的对象。如果你没有网络条件,在本地机上也可以。用你的IP地址 (127.0.0.1),你的机器名或主机名,执行下面的命令:

 

java RemoteMapClient hostName Zuzu

 

如果你的java环境已经安装并且运行正确的话,你应该看到下面的远程响应。

 

RemoteMapClient found Zuzu, value=3

 

可以喘口气休息一下了!你已经在理解RMI和适配器模式的路上走了很久了。花点时间放松一下,享受一 下你的劳动果实,我建议编译客户端和服务器端的代码,然后运行它,并且在使用中修改它。如果可能的话,在一些不同的机器上或不同的Java虚拟机上运行这个程序,你应该能够发现这个程序能够运行在不同 的平台上。

 

 

总结

    读完这篇文章后,你应该能够意识到在Java的RMI方式中使用适配器模式的价值,它的优点就是你不用改变你的本地对象,而且不用生成一个特别复杂且效率低的远程对象。区分类的责任,你的设计可以被很容 易地排错,本地对象中出现的问题属于本地类,网络对象中出现的问题属于远程适配器类。除了这些优点之外,一旦你建立了一个适配器,你就能一遍又一遍的重用这种模式。这是一种很有用的设计模式,实现 起来很简单并且容易被那些审查和维护你的代码的人阅读。

 

关于作者

    DAN工作在IBM的网络计算部(the Network Computing Software Division of IBM Corporation),它正 在致力于实现将Java 2应用于AIX、OS/2、system 390和windows平台。DAN的个人主页是 http://www.io.com/~beckerdo。

 

 

 

 

   

 

中科闻歌Java面试题及参考答案 Java 集合框架整体分为 Collection 与 Map 两大体系,Collection 存储独立单个元素,Map 存储键值对映射关系,面试答题关键点在于区分接口和具体实现类,不能只罗列类名,需要从底层存储结构出发推导性能、特性、线程安全情况,同时区分过时实现类,这部分属于面试加分点,很多面试人员只会背诵类名,忽略底层结构与线程安全带来的取舍。Collection 下分为 List、Set、Queue 三个子接口。List 集合特征为元素有序、允许元素重复,存入顺序和遍历取出顺序保持一致。ArrayLi 阅读详情

相关推荐

【5G NB-IoT NTN】3GPP R17 NB-IoT NTN介绍_nbiot ntn

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

2401_83703866的博客 3166

角色数据存储方法

角色数据存储方法 服务端需要做的一件重要的事情就是保存角色(Role)的数据,以便让他下次登陆时可以还原状态。 初始化数据 在角色首次进入场景时,初始化数据。这一个过程是由客户端发起的,流程大致是: 客户端发起请求 -> 服务端请求从数据库中获取数据 -> 获取数据后初始化Role -> 通知客户端进入场景 尽管这一个过程还做了其他许多的逻辑判断,但其核心内容就是数...

weixin_33725272的博客 626

最新Mamba环境配置教程:从CUDA到causal-conv1d的完整安装流程

本文提供最新Mamba环境配置教程,涵盖从CUDA到causal-conv1d的完整安装流程。针对深度学习领域的长序列处理需求,详细指导如何正确配置CUDA工具链、安装PyTorch及关键依赖causal-conv1d,解决常见报错问题,并验证mamba-ssm集成效果。

bush的博客 418

Spring集成–使用RMI通道适配器

1.引言 本文介绍了如何使用Spring Integration RMI通道适配器通过RMI发送和接收消息。 它由以下部分组成: 实施服务:第一部分着重于创建和公开服务。 实现客户端:显示如何使用MessagingTemplate类调用服务。 抽象SI逻辑:最后,我添加了另一部分来说明如何实现抽象所有Spring Integration代码的同一客户机,而使客户机专注于其业务逻...

最佳 Java 编程 269

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 379

从原理到实践:手把手教你如何校准和使用六维力传感器(附常见问题排查)

本文详细解析六维力传感器的工作原理与校准方法,提供从选型到故障排查的完整指南。重点介绍电阻式与电容式技术对比、六步校准法实战以及温度补偿技巧,帮助工程师精准测量空间力场。适用于机器人触觉反馈、航空航天测试等高精度场景。

weixin_29309475的博客 387

【jmx学习】3、jmx之RMI Adaptor

在我的项目中就是通过RMI Adaptor方式调用服务端的 一、服务端 MBeanServer server = MBeanServerFactory.createMBeanServer();//创建MBeanServer //RMI adaptor,可以通过jconsole去查看 //cmd先执行rmiregistry 9999,

寒雨的专栏 1286

GPU 运维实战:H100/H800/B300 换卡与压测

(烧多久、看什么、什么算合格)。文末还给了一个能直接跑的验收判定脚本,三个真实场景的裁决输出都在。

老韩的Linux云计算架构师进阶之路 271

适配远程接口调用的另类方法

所谓适配,也就是要看服务提供者如何设计实现,如何暴漏接口。       现有服务端提供收单、校验、支付等服务环节,客户端业务横向扩展的强度比较大,且有诸多共性存在,考虑到职责分离、调用的统一性,所以将业务分类做数据配置,根据配置执行不同的解析类,如下: § 实现类图        § 业务分类配置        § 代码

WebWalker 1564

【WorkBuddy专栏52】Codex与WorkBuddy生态适配、用户争夺与未来走向(下)

【WorkBuddy专栏52】Codex与WorkBuddy在中国大陆的发展——生态适配、用户争夺与未来走向(下)

AI人人懂 679

《无线传感网络 matlab》:从入门到实践

这就是如何使用Matlab建立一个简单的无线传感网络并进行仿真的方法。当然,这只是一个入门级的示例,真正的无线传感网络可能会更加复杂和庞大。首先,我们需要创建一个无线传感网络的基础结构。接下来,我们需要定义一个数据包的格式,以便节点之间可以交换信息。无线传感网络是一种由无线传感器节点组成的、自组织的网络。现在,我们可以开始编写节点代码了。我们将使用Matlab提供的工具箱来构建一个简单的无线传感网络,并对其进行仿真和分析。现在,我们可以将这个节点复制9次,以创建一个包含10个节点的无线传感网络。

NoerrorCode的博客 296

Redis高级项目实战!java程序培训多少钱

前言 这段时间也一直在学习Netty相关知识,因为涉及知识点比较多,也走了不少弯路。目前网上关于Netty学习资料玲琅满目,不知如何下手,其实大家都是一样的,学习方法和技巧都是总结出来的,我们在没有找到很好的方法之前不如按部就班先从基础开始,一般从总分总的渐进方式,既观森林,又见草木。 Netty是一款提供异步的、事件驱动的网络应用程序框架和工具,是基于NIO客户端、服务器端的编程框架。所以这里我们先以NIO和依赖相关的基础铺垫来进行剖析讲解,从而作为Netty学习之旅的一个开端。 工厂方法模式 Sprin

m0_57081140的博客 73

PTC Creo软件二次开发:使用C++进行Creo二次开发实战

C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。由Bjarne Stroustrup在贝尔实验室开发,最初作为C语言的增强版出现,后来发展成为一种独立的语言。C++不仅保留了C语言的高效性和灵活性,还引入了类、模板、命名空间等高级特性,使其成为开发复杂系统和软件的理想选择。

kkchenjj的博客 4043

java面试题美团,java面试项目经验

前言 这段时间一直在学习Netty相关知识,因为涉及知识点比较多,也走了不少弯路。目前网上关于Netty学习资料琳琅满目,不知如何下手,其实大家都是一样的,学习方法和技巧都是总结出来的,我们在没有找到很好的方法之前不如按部就班先从基础开始,一般从总分总的渐进方式,既观森林,又见草木。 Netty是一款提供异步的、事件驱动的网络应用程序框架和工具,是基于NIO客户端、服务器端的编程框架。所以这里我们先以NIO和依赖相关的基础铺垫来进行剖析讲解,从而作为Netty学习之旅的一个开端。 工厂方法模式 Spring

EDGNB123的博客 133

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

互联网大厂面试必问的JVM底层原理,先收藏了

前言 Netty 是一款基于 Java 的网络编程框架,能为应用程序管理复杂的网络编程、多线程处理以及并发。Netty 隐藏了样板和底层代码,让业务逻辑保持分离,更加易于复用。使用 Netty 可以得到一个易于使用的 API,让开发人员可以专注自己的应用程序的独特之处。介绍了 Netty 框架,并展示了如何将它引入到 Java 网络应 用程序中通过对本书的学习,读者能学到如何编写高度可伸缩的应用程序而无需关心底层 API。本书将通过许多动手的例子教读者以异步的方式进行思考,并帮助读者掌握构建大规模网络应用程

m0_58269520的博客 112

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大牛深入讲解!java多线程并发同步

前言 Netty 是一款基于 Java 的网络编程框架,能为应用程序管理复杂的网络编程、多线程处理以及并发。Netty 隐藏了样板和底层代码,让业务逻辑保持分离,更加易于复用。使用 Netty 可以得到一个易于使用的 API,让开发人员可以专注自己的应用程序的独特之处。介绍了 Netty 框架,并展示了如何将它引入到 Java 网络应 用程序中通过对本书的学习,读者能学到如何编写高度可伸缩的应用程序而无需关心底层 API。本书将通过许多动手的例子教读者以异步的方式进行思考,并帮助读者掌握构建大规模网络应用程

m0_56712948的博客 163

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

软件设计模式(实验五)—— 适配器模式的应用(Java)

实验五 适配器模式的应用(Java实现) 一、实验目的 (1)掌握适配器模式(Adapter)的特点 (2)分析具体问题,使用适配器模式进行设计。 二、实验内容和要求 一个软件团队开发绘图系统,设计了圆对象(Circle)、矩形对象(Rectangle),线对象(Line)都支持Draw()函数,即可以通过Draw()函数绘制图形。为了加快项目进度,将角度对象(Angle)绘制功能交给了合作团队实现。但合作团队将角度对象绘制函数定为了DrawAngle()。绘图系统提供给用户后,用户不满意,希望能统一的调用

weixin_45525142的博客 2428

研究在美国财务会计准则下对软件成本的会计处理

美国财务会计准则86号:对软件成本的会计处理计算机软件研发成本3 在确定计算机软件出售、租赁或者其它方式上市的技术可行性时,所发生的成本都记入研发成本。如果是按照FASB第二号的要求发生的,应记入费用。4 对于本准则来说,计算机软件技术可行性是在企业完成了所有的计划、设计、编码和测试工作以后才确定的。注:这里所说的技术可行性和软件研发领域一般意义上的技术可行性是不同的。该准则中的技术可

wearebug的专栏 2654

JAVA版hello world全攻略

JAVA版hello world全攻略侯光敏    看到很多技术网站的BBS上面充斥着java初学者的关于运行第一个java程序的求助信息,我觉得作为“过来人“很有写这篇文章的必要,因为他们遇到的都是些很低级的问题,但是让这些问题占据bbs上那么多宝贵的空间就太不应该了。    要搞清楚的基本概念    java是一种跨平台的网络语言,为了能够在不同平台上运行,它使用了虚拟机这个概念。后缀名为

wearebug的专栏 1885

由职业规划想到软件学院

??????? 今天去中科院软件园参加了关于软件人的职业发展论坛。来自软件学院的领导们和来自企业的老总们和台下我们这些程序员以及程序员中的小头目们进行了一些交流,他们介绍了国际软件产业的发展趋势和对软件人才的需求情况。由于主办方有软件学院,这个交流不可避免的软件学院联系在了一起。台下的我逐渐回忆起了自己和软件学院接触过程的点点滴滴。??????? 最早在2002年的《程序员》杂志上看到关于北航和安

wearebug的专栏 1733

建立EAI方式与SAI方式之间的通信

建立EAI方式与SAI方式之间的通信 解决JAVA控制VRML场景的一个实际问题 侯光敏 (wearebug@etang.com)2002 年 1 月搞过java语言对vrml场景控制的人都知道,目前有两种方式对vrml场景进行控制,那就是EAI方式和SAI方式.EAI的全称是External Authoring Interfac

wearebug的专栏 1529
下一篇: JAVA版hello world全攻略
wearebug
博客等级 码龄26年 2粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值