Jelenleg van egy kis alkalmazásom a statisztikák kiszámításához párhuzamos algoritmusokkal. Most problémám van a funkcionalitás egy részének bővítésével. Megpróbálom röviden elmagyarázni. Az alkalmazás a revel keretrendszerre épül. A „stat” vezérlő egyik művelete a bejövő POST json fájlt veszi igénybe. Elemzi. És két csatornát (gorutint) generál a feladatokhoz és az eredményekhez. Mindez úgy működik, mint egy varázslat. De vannak gondjaim a modellekkel. Kódot írtam, hogy lineárisan bővíthessem a modellek mennyiségét, de jelenleg csak egy volt munkában.
És nem minden módszert alkalmaznak ehhez a bővítéshez.
A kód egy részében ez van:
for t := range in {
for sourceName, charts := range t.Request.Charts {
var cacheData []byte
var deserializedData models.StatModel
//determine the model type
switch sourceName {
case "noagg":
deserializedData = new(models.NoaggModel)
case "acsi":
deserializedData = new(models.AcsiModel)
}
cache_err := cache.Get(string(string(sourceName) + "_" + string(t.Date)), &cacheData);
if cache_err != nil {
panic("the cache is empty")
}
marshal_error := json.Unmarshal([]byte(cacheData), &deserializedData)
if marshal_error == nil {
}
deserializedData.FilterData(t.Request.Filters)
deserializedData.ClusterData(t.Request.Filters)
w := Work{}
for _, chart := range charts {
countedData := ChartElements{}
if marshal_error == nil {
countedData = deserializedData.CountDataForChart(string(chart.Name))
}else {
panic("some is bad")
}
w.Name, w.Data = chart.Name, countedData
out <- w
}
}
}
A Noagg modell és az Asci modell a "stat" modell ugyanazt a felületét valósítja meg:
type StatModel interface {
FilterData(Filter)
ClusterData(Filter)
CountDataForChart(string)[]ChartElement
GroupByTreeGroups(Filter)[]OrgPack
}
De most hozzá kell adnom néhány új modellt ugyanazzal a felülettel, de van kód, amit nem tudok bővíteni. nem emlékszem hogyan kell ezt csinálni..
func statCount(model NoaggRow, f func(NoaggRow) float64) float64 {
countedStat := f(model)
return countedStat
}
func Count(model NoaggRow, name string) float64{
m := map[string]func(NoaggRow) float64 {
"HOLD" : HOLD,
"INB" : INB,
"AHT" : AHT,
"RING" : RING,
"TALK" : TALK,
"ACW" : ACW,
"OCC" : OCC,
}
countedStat := statCount(model, m[name])
return countedStat
}
Ugyanazok a módszerek, mint az ASCI modellhez. AcsiRow-hoz NoaggRow helyett. Hogyan lehet ezt a bemeneti paramétertípust dinamikussá tenni, vagy hogyan lehet a módszereket közössé tenni az összes modellhez. Csak a "map[string]func(......Row)" tömbje és neve különbözik ezen a helyen. Valaki tud nekem ebben segíteni?
deserializedData.CountDataForChart(string(chart.Name))
. Ezt a metódusokat az nsme karakterlánccal hívja meg, az adott modellből. 22.04.2016