资讯专栏INFORMATION COLUMN

强类型与弱类型语言关于存取对象(数据)的问题

lingdududu / 1776人阅读

摘要:数据库数据表的设计的示例代码实际上在异步的处理过程中很难做到,这里的类型无法确定,调用方法也无法做到,需要反射的示例代码弱类型语言就没有这样的麻烦,就能得到原来的实例对象。

在旧的业务流程加入一个“拦截”,原来从前端表单提交到后台的处理逻辑延后处理,本质上是一个异步化的处理过程。
此时将表单参数存储到数据库,在适当的时刻“拦截”结束通过时调用原来的处理逻辑。
F代表表单参数,A代表控制器参数,

F --> A --> F" --> A";

思考以上的流程,
①F --> A,从前端到controller方法
②A --> F",将参数存储到数据库
③F" --> A", 从数据库取出原来的参数对象,希望A"能够完全表达A, A" == A,包括参数类型与顺序。

数据库数据表的设计

table at_form{
 id bigint,
 name varchar
 json  varchar
 type_token varchar?
}

Java的示例代码

public class AtFormApp {
        
        public static void main(String[] args) throws IOException, ClassNotFoundException {
                Person p = new Person();
                p.name = "Honey";
                p.age = 26;
                
                controlMethod1(p);
                controlMethod2();
                
                
        }
        
        static class Person {
                
                String name;
                int age;
        }
        static void controlMethod1(Person p) throws IOException {
                saveService(p, "p");
        }
        static void controlMethod2() throws IOException, ClassNotFoundException {
                AtForm atForm = query();
                ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(atForm.typeToken.getBytes()));
                Type type = (Type) ois.readObject();
                
                //Person type here
                Person p = new Gson().fromJson(atForm.json, type.getClass()); 
                
                realService(p);
        }
        static void saveService(Person p, String name) throws IOException {
                Type type = new TypeToken() {}.getType();
                String json = new Gson().toJson(p);
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(type);
                oos.close();
                String typeToken = baos.toString();
                
                
                AtForm atForm = new AtForm();
                atForm.name = name;
                atForm.json = json;
                atForm.typeToken = typeToken;
                
                insert(atForm);
        }
        static void realService(Person p) {
                //good
        }
        
        static AtForm query() throws IOException {
                AtForm atForm = new AtForm();
                atForm.name = "p";
                atForm.json = "{"name":"Honey","age":26}";
                Type type = new TypeToken() {}.getType();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(type);
                oos.close();
                String typeToken = baos.toString();
                atForm.typeToken = typeToken;
                return atForm;
        }
        //imitate insert behavior
        static int insert(AtForm atForm) {
                return 1;
        }
        
        static class AtForm {
                Long id;
                String typeToken;
                String name;
                String json;
                
                
        }
}

实际上在异步的处理过程中很难做到,


这里的Person类型无法确定,调用realService方法也无法做到,需要反射?
PHP的示例代码

name = "Honey";
        $p->age = 26;

        $this->controlMethod1($p);
        $this->controlMethod2();
    }

    public function controlMethod1(Person $p) {
        $this->saveService($p, "p");
    }

    public function controlMethod2() {
        $atForm = AtForm::findOne(["name" => "p"]);
        $p = unserialize($atForm->data);

        $this->realService($p);
    }

    public function saveService(Person $p, $name) {
        $atForm = new AtForm();
        $atForm->name = $name;
        $atForm->data = serialize($p);
        $atForm.save();
    }


    public function realService(Person $p) {
        // good
    }
}

class Person {
    public $name;
    public $age;
}

class AtForm() {
    public $id;
    public $name;
    public $data;

    public static findOne($condition) {}
    public save() {}
}

弱类型语言就没有这样的麻烦,
$p = unserialize($atForm->data);就能得到原来的Person实例对象。
后面调用realService($p)也很自然。虽然这里讨论的示例中只有一个参数,但是多个参数的情况下,PHP也能支持。

感谢@Tranch提供的PHP示例代码

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68644.html

相关文章

  • 类型与弱类型语言关于存取对象数据问题

    摘要:数据库数据表的设计的示例代码实际上在异步的处理过程中很难做到,这里的类型无法确定,调用方法也无法做到,需要反射的示例代码弱类型语言就没有这样的麻烦,就能得到原来的实例对象。 在旧的业务流程加入一个拦截,原来从前端表单提交到后台的处理逻辑延后处理,本质上是一个异步化的处理过程。此时将表单参数存储到数据库,在适当的时刻拦截结束通过时调用原来的处理逻辑。F代表表单参数,A代表控制器参数, F...

    wenshi11019 评论0 收藏0
  • Python3基础

    摘要:以下为一段关于变量的代码整型变量字符串变量复数变量布尔型变量浮点型变量元组列表字典打印出变量的值以及对应的类型运行结果为更新至基础 (一)Python概述 python的特点 Python是一种面向对象的解释性计算机程序设计语言具有丰富且抢答的内置库和第三方库语法简洁灵活开源,而且夸平台,无论在windows、linux、MAC上均可以使用 Python的应用 Py...

    sPeng 评论0 收藏0
  • 内存 问题- 收藏集 - 掘金

    摘要:然而,中依然有可能发生内存泄漏。所以你的安卓快速定位解决内存泄漏掘金昨天是个好日子,程序员的节日,在这里给所有的程序员送上一份迟到的祝福。应用内存泄漏的定位分析与解决策略掘金,大家好,我是。 Android 性能优化之巧用软引用与弱引用优化内存使用 - Android - 掘金前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱...

    TIGERB 评论0 收藏0
  • Python基础系列:初识python引用计数与弱引用

    摘要:第一次初始化对象,并且用变量来引用,所以这里的引用计数就为。接下来通过创建一个弱引用,通过打印引用计数后,发现计数并没有改变。由于一次仅能有一个对象被回收,引用计数无法回收循环引用的对象。所以弱引用很适合处理这种循环引用的场景。 写在前边: 之前的socket系列就告一段落,主要是对自己所学做一个总结与记录。 接下来我打算基于libevent写一个支持并发的HTTP服务器。因为之前学习...

    robin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<