Владимир Коротенко,
У меня есть 2 класса контрагентов которые получают json данные по api со склада.
В каждом классе есть метод getModfifcation который возвращает List (список модификаций).
class Modification
{
public string link;
public string name;
public string product;
public int size;
public string color;
public string code;
}
class Tvshop
{
public List<Modification> getModification(){
int offset = 0;
ReadJson json = new ReadJson(offset);
var Modification = new List<Modification>();
JObject data = JObject.Parse(json.getResponseModification());
for (int v = 0; v < 10; v++)
{
foreach (JObject item in (JArray)data["rows"])
{
Modification.Add(new Modification
{
// Здесь заменяемая часть кода.
product = item.GetValue("product")["meta"]["href"].ToString(),
link = item.GetValue("meta")["href"].ToString(),
name = item.GetValue("name").ToString(),
color = colors,
size = sizes,
code = bcodes
});
}
json = new ReadJson(offset += 100);
data = JObject.Parse(json.getResponseModification());
}
return Modification;
}
}
class Mamsi
{
public List<Modification> getModification(){
int offset = 0;
ReadJson json = new ReadJson(offset);
var Modification = new List<Modification>();
JObject data = JObject.Parse(json.getResponseModification());
for (int v = 0; v < 10; v++)
{
foreach (JObject item in (JArray)data["rows"])
{
Modification.Add(new Modification
{
// Здесь заменяемая часть кода.
product = item.GetValue("product")["meta"]["href"].ToString(),
link = item.GetValue("meta")["href"].ToString(),
name = item.GetValue("name").ToString(),
});
}
json = new ReadJson(offset += 100);
data = JObject.Parse(json.getResponseModification());
}
return Modification;
}
}
Тут сразу бросается в глаза дублирование кода. Я попытался создать класс родительский и добавить наследников этому классу.
class Counterparty{
public List<Modification> getModification(){
int offset = 0;
ReadJson json = new ReadJson(offset);
var Modification = new List<Modification>();
JObject data = JObject.Parse(json.getResponseModification());
for (int v = 0; v < 10; v++)
{
foreach (JObject item in (JArray)data["rows"])
{
Modification.Add(new Modification
{
// Здесь заменяемая часть кода.
product = item.GetValue("product")["meta"]["href"].ToString(),
link = item.GetValue("meta")["href"].ToString(),
name = item.GetValue("name").ToString(),
});
}
json = new ReadJson(offset += 100);
data = JObject.Parse(json.getResponseModification());
}
return Modification;
}
class CounterpartyMamsi : Counterparty {
}
И тут я завис,не пойму как можно вот этот кусок кода вырезать правильно
Modification.Add(new Modification
{
// Здесь заменяемая часть кода.
product = item.GetValue("product")["meta"]["href"].ToString(),
link = item.GetValue("meta")["href"].ToString(),
name = item.GetValue("name").ToString(),
});
Где стоит коммент "// Здесь заменяемая часть кода." Там нужно записывать только в те поля которые нужны.
В дочернем классе какой нибудь метод описать которые добавляет поля:
class CounterpartyMamsi : Counterparty {
ModififcationAdd(item){
}
}
Готов переписать весь код на правильный если нужно,я тут самого главного не могу понять,как это можно грамотно реализовать не дублируя.
interface Modification
{
}
class FirstDest implements Modification
{
public string link;
public string name;
public string product;
}
class SecondDest extends FirstDest
{
public int size;
public string color;
public string code;
}
abstract class ModificationParser<TDest>
{
void Parse(JObject item, TDest destination);
}
class ModificationParserFirst implements ModificationParser<FirstDest>
{
void Parse(JObject item, FirstDest destination)
{
destination.product = item.GetValue("product")["meta"]["href"].ToString();
destination.link = item.GetValue("meta")["href"].ToString();
destination.name = item.GetValue("name").ToString();
}
}
class ModificationParserSecond extends ModificationParserFirst implements ModificationParser<SecondDest>
{
void Parse(JObject item, SecondDest destination)
{
base.Parse(item, destination);
// todo дополнительные поля, типо color
}
}
// там где парсим список объектов
foreach (JObject item in (JArray)data["rows"])
{
Modification dest = GetModificationOfType(some..);
ModificationParser<T> parser = GetParserOfType(something..);
parser.Parse(item, dest);
Modifications.Add(dest);
}
в зависимости от того что возвращает
Modification dest = GetModificationOfType(some..);
ModificationParser parser = GetParserOfType(something..);
(они должны соответствовать друг другу)
можно сделать такие варианты:
1) каждый элемент списка может быть распарсен в свой, это полиморфность истинная, тогда определяйте на каждом витке цикла - тип
2) все элементы списка одного типа (вроде как у вас)
AlexHell, спасибо! Я уже решил эту задачу, кстати также получилось почти как у Вас))). Ну у Вас чуть по другому получилось, тоже запомню такой вариант.