应该将哪些参数传递给不可变类构造函数?

时间:2016-07-26 18:15:25

标签: c# constructor immutability

我们经常想从数据库构建它们,但我们可能还想创建用于测试或从文件加载的假货。

我们是否应该有一个构造函数:

  1. IDataReader
  2. 每一个领域。
  3. 该类的可变版本,因此repo可以创建可变版本,更新它,然后使用此构造函数转换为不可变版本吗?
  4. 其他完全
  5. 我不喜欢选项1,因为这意味着每个班级都需要知道library(ggmap) library(plyr) img_Mapa <- get_map('Brazil', zoom = 4) val_Qtd <- c(34, 10, 11, 7, 55, 18, 33, 16, 16, 249) nom_State <- c("Distrito Federal","Bahia","Ceara","Espirito Santo","Minas Gerais","Parana","Rio de Janeiro","Rio Grande do Sul","Santa Catarina","Sao Paulo") lon <- c(-47.86447, -41.70073, -39.32062, -40.30886, -44.55503, -52.02154, -43.20940, -51.21770, -50.21886, -46.62918) lat <- c(-15.799765, -12.579738, -5.498398, -19.183423, -18.512178, -25.252089, -22.913948, -30.034632, -27.242339, -23.543179) ds_DadosAcessos <- data.frame(char = nom_State, lon, lat, val_Qtd) temp <- apply(ds_DadosAcessos, 1, function(x) { data.frame(lon = as.numeric(rep(x[2], log(as.numeric(x[4])))), lat = as.numeric(rep(x[3], log(as.numeric(x[4])))))}) heatdata2 <- ldply(temp, rbind) ggmap(img_Mapa, extent = "device") + stat_density2d(data = heatdata2, aes(x = lon, y = lat, fill = ..level.. , alpha = ..level..), geom = "polygon", position = "identity", contour = TRUE, n = 100) + scale_fill_gradient(low = "green", high = "red") + scale_alpha(range = c(0, 0.3), guide = FALSE) ,2似乎没问题,但是我们想要添加字段时似乎需要大量维护,而且3似乎没问题也可以在任何时候添加一个字段(尽管少于2个)进行维护。

    提前致谢。

1 个答案:

答案 0 :(得分:1)

不可变对象通常是通过创建构建器构建的,然后将所有属性设置为相关的,最后调用Commit()来检索它的不可变版本。

我个人非常喜欢看起来像这样的“虚假”不可变类:

public interface IPlanet
{
    string Name { get; }
}

internal class PlanetBuilder : IPlanet
{
    public string Name { get; set; }

    public IPlanet Commit()
    {
        return this;
    }
}

这种结构的优点是写入的开销非常小。 Commit()方法甚至可以重构为通用基类。

不好的是,任何人都可以通过将对象强制转换为工厂类类型来篡改对象。