V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tctc4869
V2EX  ›  程序员

类字段命名问题,一个类初始化时某个值为 null,只有调用另一个类的方法,该类的某个字段才会有内容,这个字段怎么命名?

  •  
  •   tctc4869 · 2020-06-29 10:16:12 +08:00 · 1433 次点击
    这是一个创建于 1608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    已知有一个类,不知道这个类有多少个类型字段,但是至少有一个字段的类型是知道的,类型是动态的。换成 java 里就是 Object,换成 c#就是 Object,Dynamic 。

    为了方便称呼,把该类称为 A 类,把该字段称为 A 字段。A 类实例创建时,A 字段是 null 值。

    此时有一个 B 类,B 类里有一个方法的形式参数是 A 类,称呼该方法为 B 方法。调用 B 类实例的 B 方法,传入 A 类实例,之后 A 类实例的 A 字段就有了内容,并且这个内容要么是 B 类实例里的某个字段,要么是 B 类实例与 A 类实例的其他字段内容运算产生的结果。只有这两种可能。

    请问 A 类里的 A 字段叫什么名字比较好一点

    wysnylc
        1
    wysnylc  
       2020-06-29 10:26:07 +08:00
    命名问题老世纪难题了
    GM
        2
    GM  
       2020-06-29 10:31:03 +08:00
    setA(Object value);

    hahahaha
    cruii
        3
    cruii  
       2020-06-29 11:29:47 +08:00
    placeholder (狗头
    zsdroid
        4
    zsdroid  
       2020-06-29 11:30:01 +08:00
    不管类型怎么多变,总知道这个字段的作用吧。
    aguesuka
        5
    aguesuka  
       2020-06-29 12:06:37 +08:00 via Android
    attachment
    xiangyuecn
        6
    xiangyuecn  
       2020-06-29 12:15:54 +08:00
    泛型啊。泛型类 或者 泛型方法 想怎么定义就怎么定义

    伪代码意思意思
    class B{
    func b<T>(A<T> aaa,.......T val){
    aaa.setVal(val);
    }
    }

    class A <T>{
    T value
    func val(T val){
    value=val
    }
    }


    B bbb=new B()

    A<str> a1=new A<str>()
    A<int> a2=new A<int>()

    bbb.b(a1, "abc") // a1.value="abc"
    bbb.b(a2, 123) // a2.vlaue=123
    dallaslu
        7
    dallaslu  
       2020-06-29 13:00:46 +08:00
    externalAssignmentValue
    Lalavava
        8
    Lalavava  
       2020-06-29 18:48:37 +08:00
    首先根据问题描述
    这里问题应该不在取什么名字
    而是你的这种设计本来就糟糕透顶
    你在外部对一个对象实例内部字段进行初始化
    试想一下如果别人看你的代码
    他必须搜索所有代码 去找到你在什么地方进行了初始化
    因为你可以在任何地方进行初始化
    而且初始化这个字段的位置可以和 new A 的地方没任何关系

    对于你描述的场景
    如下代码应该是比较好的
    class A<T> {
    public A(Supplier<T> initializer) {
    a = CompletableFuture.supplyAsync(initializer);
    }

    public T getA() {
    try {
    return a.get();
    } catch (InterruptedException | ExecutionException e) {
    throw new RuntimeException(e.getCause());
    }
    }

    private final CompletableFuture<T> a;
    }

    class B {
    public int foo() {
    return 0;
    }
    }

    public class Main {
    public static void main(String[] args) {
    var a = CompletableFuture.supplyAsync(B::new).thenAccept(b -> new A<Integer>(b::foo));
    }
    }
    tctc4869
        9
    tctc4869  
    OP
       2020-06-29 19:55:53 +08:00
    @Lalavava
    任何设计工具都有可能找到合适它的用武之地,用不好工具,别人阅读远吗无法理解,这些现象不过程序员素质造成的。

    而且真有礼貌,素质可真好啊,在说糟糕透顶之前,应该问一下,这个设计思路的最终目的是用在哪里的么?为什么要这么设计,没有可代替的更容易让人理解的方案么。在得到最终原因回答之后(但我也没有说),再说教至少是有理了
    msg7086
        10
    msg7086  
       2020-06-30 03:28:38 +08:00
    b_data b_storage b_info b_result 等等。本质上还是要写清楚用途。
    lijialong1313
        11
    lijialong1313  
       2020-06-30 09:33:09 +08:00
    我听着这像 XY 问题,建议详细描述为什么要这么做。

    我想象不到为什么需要实例 B 来初始化一个实例 A 的字段值,如果需要这个字段值,可以直接使用实例 B 而并非实例 A,即使其基于 A 、B 运算结果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1077 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 89ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.