Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

​Инвариант в строго типизированном классе.

167  
Murr патриот11.05.18 13:49
Murr
11.05.18 13:49 

Инвариант в строго типизированном классе.


Дан код.

В коде используется ДатаТабле. Загрузка - инвариантная - из динамического СКЛ.

Отличаются не данные - с этим проблем нет, отличается структура хранимого набора - имена и количество полей.


Кое-что - совпадает, еще кое-что - могу привести к совпаданию.

Но разное количество полей все одно никак не победить.


Вопросик: Как унифицировать это дело?

#1 
AlexNek патриот11.05.18 17:53
AlexNek
NEW 11.05.18 17:53 
в ответ Murr 11.05.18 13:49

Самое простое через словарь. Имя-значение.

Делал еще по "классу" на значение. Была и иерархия классов при этом. Каждое значение знало о себе всё. И комбинируй как хошь, в любые группы.

#2 
Murr патриот14.05.18 10:33
Murr
NEW 14.05.18 10:33 
в ответ AlexNek 11.05.18 17:53

Самое простое через словарь.

-----

Это - сложное.


Вроде нашел общую основу - можно вынести в базовый класс, провести основной общий пересчет, а потом дернуть виртуальный метод для пересчета уникальностей...

Но - голова пухнет от писанины и связеj...

#3 
AlexNek патриот14.05.18 12:33
AlexNek
NEW 14.05.18 12:33 
в ответ Murr 14.05.18 10:33
Это - сложное.

Тогда тебе нужно не то, что ты описываешь.

Если даже и "универсальный дата элемент" не подходит, то проблема зарыта в другом месте. Отделяй логику от данных.

Логикой должны заниматься "другие".

#4 
Murr патриот14.05.18 12:49
Murr
NEW 14.05.18 12:49 
в ответ AlexNek 14.05.18 12:33

Отделяй логику от данных.

-----

Ну А Я что делаю?

Просто там 443,293 bytes of code.

И все в а-ля ВБ-6... Классов - нет, инкапсуляции нет, одни ДатаТабле и функции, функции, функции...

Любимая фича - прередать в функцию ДатаТабле, добавить с 5-ок параметров, внутри запутать логику путем создания 10-ка дополнительных ДатаТабле... потом плюнуть на все - дописать несколько полей в таблицу и переприсвоить ее оригинальной таблице... пока каждый такой кусок не разберешь на составляющие и осознаешь что именно там делается - отделять нечего... и такого - 450К...


#5 
AlexNek патриот14.05.18 14:31
AlexNek
NEW 14.05.18 14:31 
в ответ Murr 14.05.18 12:49
и такого - 450К...

Могу только посочувствовать, зато до пенсии хватит работы спок

Такие штуки за раз не делаются нормально, нужны итерации. Тем более, что нужна постоянно работающая система. Это еще на порядок сложнее.

Таблицы то хоть имеют смысл какой-то или тоже лишь бы как?

#6 
Murr патриот14.05.18 15:57
Murr
NEW 14.05.18 15:57 
в ответ AlexNek 14.05.18 14:31

Такие штуки за раз не делаются нормально, нужны итерации.

-----

Это Я вполне себе понимаю.

Только объемы такие, что одному неподъемно... Эти 450К всего лишь часть системы... по сумме - 2Гб соурсов...



Тем более, что нужна постоянно работающая система.

-----

Угу... Я вот переработал другой кусок кода... почти все подтянул... что-то даже работало...

На следующей итерации выяснилось, что можно еще упростить, сделав более правильные базовые классы...

Классы - сделал. А времени переработать код используя эти классы - нету... там - много...

Так и лежит - что-то работающее, что-то доработанное, что-то - вообще не понятное...

Плюс, еще выяснилось, что есть еще кусок кода, который надо синхронно дорабатывать.

А в этом куске - ой, чего там только нет - и работа с базой, и работа с железом, и работа с сетью...

да еще и юзерский интерфейс замороченный...

И все - ВБ6-лике - раздербанить на логические куски - не выходит...



зато до пенсии хватит работы

-----

Это точно плюс. Только вот через пару лет все одно сваливаю. На Юг, к морю...



Таблицы то хоть имеют смысл какой-то или тоже лишь бы как?

------

Га?!!!

Вот только что переработал кусок

[пре]

public DataTable loadDTItemsFurnace2(string startDate, string finishDate, string furnaceID)

{

string[] str;

IEnumerator enumerator = null;

IEnumerator enumerator1 = null;

DataTable DTScanBcd = new DataTable();

DataTable DTBatches = new DataTable();

DataTable DTToughMan = new DataTable();

DataTable DTToughOpt = new DataTable();

DataTable DTTough = null;

try

{

str = new string[] { "SELECT DISTINCT tod.TOD_BATCH_NO batchNo, tod.TOD_OPT_RECIPE recipe, tod.TOD_PIT_NO pitNo FROM C_TOUGH_OPT_DONE tod WHERE tod.TOD_TIMESTAMP BETWEEN TO_DATE('", startDate, "','DD-MON-YY HH24:MI') AND TO_DATE('", finishDate, "','DD-MON-YY HH24:MI') AND tod.TOD_COMPLETE=1 AND tod.TOD_FURNACE_NO IN (", furnaceID, ") " };

DTBatches = (DataTable)DANenprod1.fillDT(string.Concat(str));

try

{

enumerator = DTBatches.Rows.GetEnumerator();

while (enumerator.MoveNext())

{

DataRow DRBatches = (DataRow)enumerator.Current;

str = new string[] { "SELECT 666 bcd, tod.TOD_TIMESTAMP timestamp, SYSDATE presentTime, tmr.TMR_BATCH_NO batchNo, tmr.TMR_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, TOD_OPT_RECIPE recipe FROM AUF_KOPF_TEXTE akt, PRD_SEQ ps, AUF_POS ap, C_TOUGH_OPT_DONE tod, C_TOUGH_MAN_RESULT tmr WHERE tod.TOD_FURNACE_NO=tmr.TMR_FURNACE_NO AND tod.TOD_OPT_RECIPE=tmr.TMR_OPT_RECIPE AND tod.TOD_BATCH_NO=tmr.TMR_BATCH_NO AND tmr.TMR_PIT_NO=tod.TOD_PIT_NO AND tmr.TMR_BATCH_NO=ps.PS_BATCH_NO AND tmr.TMR_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND tod.TOD_COMPLETE=1 AND tod.TOD_BATCH_NO=", DRBatches["batchNo"].ToString(), " AND tod.TOD_OPT_RECIPE=", DRBatches["recipe"].ToString(), " AND tod.TOD_PIT_NO=", DRBatches["pitNo"].ToString(), " AND tod.TOD_FURNACE_NO IN (", furnaceID, ")" };

DTToughMan = (DataTable)DANenprod1.fillDT(string.Concat(str));

if (DTToughMan.Rows.Count == 0)

{

str = new string[] { "SELECT 666 bcd, tod.TOD_TIMESTAMP timestamp, SYSDATE presentTime, tor.TOR_BATCH_NO batchNo, tor.TOR_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, TOD_OPT_RECIPE recipe FROM AUF_KOPF_TEXTE akt, PRD_SEQ ps, AUF_POS ap, C_TOUGH_OPT_DONE tod, C_TOUGH_OPT_RESULT tor WHERE tod.TOD_FURNACE_NO=tor.TOR_FURNACE_NO AND tod.TOD_OPT_RECIPE=tor.TOR_OPT_RECIPE AND tod.TOD_BATCH_NO=tor.TOR_BATCH_NO AND tor.TOR_PIT_NO=tod.TOD_PIT_NO AND tor.TOR_BATCH_NO=ps.PS_BATCH_NO AND tor.TOR_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND tod.TOD_COMPLETE=1 AND tod.TOD_BATCH_NO=", DRBatches["batchNo"].ToString(), " AND tod.TOD_OPT_RECIPE=", DRBatches["recipe"].ToString(), " AND tod.TOD_PIT_NO=", DRBatches["pitNo"].ToString(), " AND tod.TOD_FURNACE_NO IN (", furnaceID, ")" };

DTToughOpt = (DataTable)DANenprod1.fillDT(string.Concat(str));

if (DTToughOpt.Rows.Count > 0)

{

if (DTTough != null)

{

DTTough.Merge(DTToughOpt);

}

else

{

DTTough = DTToughOpt.Copy();

}

}

}

else if (DTTough != null)

{

DTTough.Merge(DTToughMan);

}

else

{

DTTough = DTToughMan.Copy();

}

}

}

finally

{

if (enumerator is IDisposable)

{

(enumerator as IDisposable).Dispose();

}

}

str = new string[] { "SELECT pf.PF_BARCODE bcd, pf.PF_DATE_TIME timestamp, SYSDATE presentTime, ps.PS_BATCH_NO batchNo, ps.PS_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, 0.0 recipe FROM AUF_KOPF_TEXTE akt, PRD_FERTIG pf, PRD_SEQ ps, AUF_POS ap WHERE pf.PF_BATCH_NO=ps.PS_BATCH_NO AND pf.PF_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND pf.PF_DATE_TIME BETWEEN TO_DATE('", startDate, "','DD-MON-YY HH24:MI') AND TO_DATE('", finishDate, "','DD-MON-YY HH24:MI') AND pf.PF_STATION IN (", furnaceID, ") UNION SELECT lb.LB_BCD bcd, lb.LB_TIMESTAMP timestamp, SYSDATE presentTime, ps.PS_BATCH_NO batchNo, ps.PS_SEQUENCE_NO seqNo, ps.PS_ORDER_NO orderNo, ps.PS_ORDER_POS itemNo, akt.AT_CUST_NAM customerName, 1 qty, ap.AP_WIDTH_1/1000*AP_HEIGHT_1/1000 sqm, 0.0 recipe FROM AUF_KOPF_TEXTE akt, C_LOG_BCD lb, PRD_SEQ ps, AUF_POS ap WHERE lb.LB_BATCH_NO=ps.PS_BATCH_NO AND lb.LB_SEQUENCE_NO=ps.PS_SEQUENCE_NO AND ps.PS_ORDER_NO=ap.AP_ORDER_NO AND ps.PS_ORDER_POS=ap.AP_ORDER_POS AND akt.AT_ORDER_NO=ps.PS_ORDER_NO AND lb.LB_TIMESTAMP BETWEEN TO_DATE('", startDate, "','DD-MON-YY HH24:MI') AND TO_DATE('", finishDate, "','DD-MON-YY HH24:MI') AND lb.LB_STATION IN (", furnaceID, ") " };

DTScanBcd = (DataTable)DANenprod1.fillDT(string.Concat(str));

if (DTScanBcd.Rows.Count > 0)

{

if (DTTough != null)

{

try

{

enumerator1 = DTScanBcd.Rows.GetEnumerator();

while (enumerator1.MoveNext())

{

DTTough.ImportRow((DataRow)enumerator1.Current);

}

}

finally

{

if (enumerator1 is IDisposable)

{

(enumerator1 as IDisposable).Dispose();

}

}

}

else

{

DTTough = DTScanBcd.Copy();

}

}

}

catch (Exception exception)

{

ProjectData.SetProjectError(exception);

Exception ex = exception;

string str1 = this._senderAddress;

string settings = MySettingsProperty.Settings.emailErrorRecipient;

str = new string[] { MyProject.Computer.Name.ToString(), ": error in: ", this.GetType().Name, ".", MethodBase.GetCurrentMethod().Name.ToString() };

Email.SendMailMessage(str1, settings, "", "", string.Concat(str), string.Concat("\r\n", ex.ToString()));

ProjectData.ClearProjectError();

}

return (DTTough != null ? DTTough : DTScanBcd);

}

[/пре]


Имеет оно смысл? Или нет?


Вот переработанный кусок:

public void loadDTItemsFurnace2(string pMachineIDs, DateTime pStartDate, DateTime pFinishDate)

{

try

{

TBatches.Table batches = new TBatches.Table();

batches.Load(pMachineIDs, pStartDate, pFinishDate);

TToughMan.Table toughMan = new TToughMan.Table();

TToughOpt.Table toughOpt = new TToughOpt.Table();

foreach (TBatches.Row batch in batches)

{

toughMan.Load(pMachineIDs, batch.BatchNo, batch.Recipe, batch.PitNo);

toughOpt.Load(pMachineIDs, batch.BatchNo, batch.Recipe, batch.PitNo);

this.Append(toughMan);

this.Append(toughOpt);

}

TScanBcd.Table scanBcd = new TScanBcd.Table();

scanBcd.Load(pMachineIDs, pStartDate, pFinishDate);

this.Append(scanBcd);

}

catch (Exception ex)

{

TExceptionHandler.Error(ex);

}

}

Тут вроде смысл просматривается... но это - почти день работы.

#7