powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / требуется Ведущий разработчик Cache (Москва)
25 сообщений из 76, страница 2 из 4
требуется Ведущий разработчик Cache (Москва)
    #35421933
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например сколько "стоит" такой код? (На взгляд специалиста по MSSQL :-) )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
 //только для дефолтового хранения
 //d checkIndex^checkIndex("Contracts.EPhDogovor","Ab")
 //d checkClass^checkIndex("Payments.EbgPayments")
simplyRebuild(file= 0 ) //перестроить все индексы средствами каше
 d openFile(file)
 s class=$o(^oddCOM("A"))	
 while class'=""
     {s classtype=$g(^oddCOM(class,23))
      if classtype="persistent" 
          {w !,"Перестройка индесов ",class
	       x "d ##class("_class_").%BuildIndices(,1)"
          }
	  s class=$o(^oddCOM(class))	
     }
 q 
checkAll(repair=0,file=0) public
{d openFile(file)
 s class=$o(^oddCOM("A"))	
 while class'=""
     {s classtype=$g(^oddCOM(class, 23 ))
      d:classtype="persistent" checkClass(class,repair)
	  s class=$o(^oddCOM(class))	
     }
 q
} 
 //Комплексная проверка для класса
checkClass(class,repair= 0 ,file= 0 ) public
 {d openFile(file)
  s dataS=$g(^oddCOM(class,"s","Default", 24 ))	
  if dataS="" {w !,"Класс ",class," не существует или имеет нестандартное хранение" q}
  w !,"Проверка индексов для класса:",class
  
  d checkIndexExist(class,repair)
  d checkIndexCorrect(class,repair)  
  q
 }
 
 // проверяет индексные записи на корректность. Пока не проверяет доп-поля                                  
checkIndexCorrect(class,repair= 0 ,file= 0 )[storageIndex] public
 {n storageIndex
  d openFile(file)
  if $d(^oddCOM(class,"s","Default", 24 ))= 0  {w !,"Нестандартное хранение или неверный класс" q}
  s dataStorage=$g(^oddCOM(class,"s","Default", 24 )) 
  s indexStorage=^oddCOM(class,"s","Default", 25 )
  d buildStorageIndex(class)
  
  s index=$o(^oddCOM(class,"i","")) //собираем индексные поля
  while index'=""
      {s indexLength(index)=^oddCOM(class,"i",index,"I")
	   f i=1:1:indexLength(index) s indexField(index,i)=^oddCOM(class,"i",index,"I",i,23)	   
       
       //собираем дата-поля от индекса	   
	   s indexDataList=$p(^oddCOM(class,"i",index,22),"~",4)
	   s indexDataLength(index)=$l(indexDataList,",")
	   s:indexDataList'="" indexDataLength(index)=indexDataLength(index)+ 1 
 
	   s indexData(index, 1 )="%%CLASSNAME"
	   f i= 1 : 1 :indexDataLength(index) s indexData(index,i+ 1 )=$p(indexDataList,",",i)
	   
	   //удалим из списка проверки idkey
	   k:^oddCOM(class,"i",index, 5 )="key" indexLength(index),indexField(index),indexData(index)
	   s index=$o(^oddCOM(class,"i",index))
      }
   
  s indexLine=$q(@indexStorage@(""))
  while indexLine'=""
      {
	   s index=$qs(indexLine,1)
	   g:$d(indexLength(index))=0 skipRecord  //Чужой индекс, возможно от чужого класса
       s id=$qs(indexLine,2+indexLength(index))
       s existDataFlag=$d(@dataStorage@(id)) 
       if existDataFlag=0 
           {w !,indexLine," ;индекс на несуществующую запись"
            k:repair @indexLine
            w:repair " /удаляем"
            g skipRecord
           }       
       f i=1:1:indexLength(index) //проверка основных индексных полей
           {s fieldName=indexField(index,i)
            s fieldType=$lg(storageIndex(fieldName),4)
            s fieldValue(i)=$$getValue(dataStorage,id,fieldName)
	        s fieldValue(i)=$$normalizeData(fieldValue(i),fieldType)
	        if fieldValue(i)'=$qs(indexLine, 1 +i)
	            {w !,indexLine," ;в индексе ",index," неправильное поле:",fieldName,", ожидается:'",fieldValue(i),"'"
                 w:repair ", /удаляем индекс" 
                 k:repair @indexLine 
                 g skipRecord           
	            }
           }
       /**Проверка дата-полей*/
       if indexDataLength(index)= 1   //если поле данных одно, то это имя класса и хранится оно как строка
           {s fieldName=indexData(index, 1 )
            s fieldValue=$$getValue(dataStorage,id,fieldName)
            s indexDataValue=$g(@indexLine)
            s indexDataExist=$d(@indexLine)
 
            if (indexDataValue'=fieldValue)||('indexDataExist)
                {w !,indexLine," ;в индексе ",index," поле данных:",fieldName,", ожидается:'",fieldValue,"' вместо:",$case(indexDataExist, 1 :"'"_indexDataValue_"'",:"~пусто~"),""
                 w:repair ", /исправляем" 
                 s:repair @indexLine=fieldValue
                }
            g skipRecord    
           }
       f i= 1 : 1 :indexDataLength(index)  //если полей данных много, то хранятся они как список
           {s fieldName=indexData(index,i)
            s fieldValue=$$getValue(dataStorage,id,fieldName)
            s indexDataValue=$lg(@indexLine,i)
            s indexDataExist=$ld(@indexLine,i)
 
            if (indexDataValue'=fieldValue)||('indexDataExist)
                {w !,indexLine," ;в индексе ",index," поле данных:",fieldName,", ожидается:'",fieldValue,"' вместо:",$case(indexDataExist, 1 :"'"_indexDataValue_"'",:"~пусто~"),""
                 w:repair ", /исправляем" 
                 s $li(@indexLine,i)=fieldValue
                }
           }     
skipRecord  //метка типа continue
	   s indexLine=$q(@indexLine)
      }
  s res=$lb(count,countMissIndex)
  q 
 }
 /*Проверяет наличие корректных индексов для экземпляров класса*/
checkIndexExist(class,repair= 0 ,file= 0 )[storageIndex] public
 {n storageIndex
  d openFile(file)
  if $d(^oddCOM(class,"s","Default", 24 ))= 0  {w !,"Нестандартное хранение или неверный класс" q}
  s dataStorage=$g(^oddCOM(class,"s","Default", 24 )) 
  s indexStorage=^oddCOM(class,"s","Default", 25 )
  d buildStorageIndex(class)
  s classNameList=$$buildClassnameList(class)
  
  s index=$o(^oddCOM(class,"i",""))
  while index'=""
      {s indexLength(index)=^oddCOM(class,"i",index,"I")
	   f i=1:1:indexLength(index) s indexField(index,i)=^oddCOM(class,"i",index,"I",i,23)
	   
	   //удалим из списка проверки idkey
	   k:^oddCOM(class,"i",index,5)="key" indexLength(index),indexField(index)
	   s index=$o(^oddCOM(class,"i",index))
      }
  s id=$o(@dataStorage@(""))
  while id'=""
      {//если это наследованный класс, но у экземпляра не совпадающее %%CLASSNAME,
       //ставим флаг чужого класса
       s className=$$getValue(dataStorage,id,"%%CLASSNAME")
       s targetClassFlag=classNameList[className
	   s index=$o(indexLength(""))
       while (index'="")&&(targetClassFlag)
           {s indexLength=indexLength(index)
           
	        f i=1:1:indexLength
               {s fieldName=indexField(index,i)
                s fieldType=$lg(storageIndex(fieldName),4)
                s fieldValue(i)=$$getValue(dataStorage,id,fieldName)
	            s fieldValue(i)=$$normalizeData(fieldValue(i),fieldType)
               }
            s flagOK=""
            s:indexLength=1 flagOK=$d(@indexStorage@(index,fieldValue(1),id))
            s:indexLength=2 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),id))
 	        s:indexLength=3 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),id))
 	        s:indexLength=4 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),fieldValue(4),id))
 	        s:indexLength=5 flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),fieldValue(4),fieldValue(5),id))
            if flagOK'= 1  
                {w !,"index=",index," для id=",id," отсутствует ("
                 f i= 1 : 1 :indexLength w indexField(index,i),"=",fieldValue(i),","
                 w "id=",id,")"
                 if repair
                     {s:indexLength= 1  @indexStorage@(index,fieldValue( 1 ),id)=""
                      s:indexLength= 2  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),id)=""
 	                  s:indexLength= 3  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),id)=""
 	                  s:indexLength= 4  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),fieldValue( 4 ),id)=""
 	                  s:indexLength= 5  @indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),fieldValue( 4 ),fieldValue( 5 ),id)=""
 	                  w " /строим базовую часть"
                     } 
                } 
	        s index=$o(indexLength(index))
           }
	   s id=$o(@dataStorage@(id))
      }
  q 
 }
 /*Собирает информацию о хранении в специальную переменную storageIndex*/
buildStorageIndex(class)[storageIndex]  
 {k storageIndex
  s storage=$o(^oddCOM(class,"s","Default","D",""))
  while storage'=""
      {
       s storageType=$g(^oddCOM(class,"s","Default","D",storage,22),"listnode")
	   if storageType="listnode"
	       {s i=$o(^oddCOM(class,"s","Default","D",storage,"V",""))
		    while i'=""
               {s field=^oddCOM(class,"s","Default","D",storage,"V",i, 21 )
                s type=$g(^oddCOM(class,"a",field, 40 ))
                s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
                s storageIndex(field)=$lb(i,subscript,storageType,type)
	            s i=$o(^oddCOM(class,"s","Default","D",storage,"V",i))
               }   
	       }     
	   if (storageType="subnode")||(storageType="node")
	       {s field=^oddCOM(class,"s","Default","D",storage, 21 )
            s type=$g(^oddCOM(class,"a",field, 40 ))
            s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
            s storageIndex(field)=$lb(i,subscript,storageType,type)
	       }
	   s storage=$o(^oddCOM(class,"s","Default","D",storage))
      }
  q
 }
 /*Переводит данные в формат для хранения в индексах. Пока знает только %String */
normalizeData(value,type)
{q:type="%Library.String" $system.SQL.SQLUPPER(value)
 q:value="" -1e14
 
 q value
} 
 /*Выдергивает значение поля из глобала. Как раз для этого и нужнен был storageIndex*/
getValue(dataStorage,id,fieldName)[storageIndex]
{s storageOffset=$lg(storageIndex(fieldName), 1 )
 s storageSubscript=$lg(storageIndex(fieldName), 2 )
 s storageSubscript=$tr(storageSubscript,"""","")
 s storageType=$lg(storageIndex(fieldName), 3 )
 
 s:storageSubscript="" fieldValue=$g(@dataStorage@(id))
 s:storageSubscript'="" fieldValue=$g(@dataStorage@(id,storageSubscript))
 
 q:storageType="listnode" $lg(fieldValue,storageOffset)
 q fieldValue
}
 /*Строит список имен классов, которые может иметь экземпляр данного класса,
   так как при наследовании имя класса может отличаться   */
buildClassnameList(class1) 
{s classList="~"
 //если класс наследуется напрямую от %Persistent, имя класса может быть пустым
 s:$p($g(^oddCOM(class1,60)),",")="%Library.Persistent" classList=classList_"~"
 s class=$o(^oddCOM("A"))	
 while class'=""
     {//^oddCOM(class, 45 ) - Это вся цепочка наследованных классов
	  s:$f($g(^oddCOM(class, 45 )),"~"_class1_"~") classList=classList_class_"~"
	  s class=$o(^oddCOM(class))	
     }
 q classList
} 
openFile(file)
{q:file= 0 
 c file o file:"NW": 1  
 w:'$test "Файл ",file," не открыт"
 u:$test file 
}
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421941
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421944
Ivan.Kokov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
non-alexandroКод cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...

Позвольте полюбопытствовать, как вы это поняли?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421945
logist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Для меня основной критерий оценки чужого кода - код хороший, если я могу легко
понять, чего там написано и как оно работает. Второй критерий - можно ли это
написать лучше.

Для кода, который пишется в нашей компании, к этому прибавляется соответствие
корпоративному стандарту на код.

И если с понятностью кода тут все хорошо, улучшить можно довольно многое ))

1. Если все равно работаем с классами, нафига еще использовать программы?
2. Зачем ходить по oddCOM напрямую, когда есть для этого интерсистемовские макросы?

> x "d ##class("_class_").%BuildIndices(,1)"
Давно уже есть $zobjclassmethod; возвращаемое методом значение нужно проверять.

Перед построением индексов нужно удалить старые через %PurgeIndices().

> s:indexLength=4
flagOK=$d(@indexStorage@(index,fieldValue(1),fieldValue(2),fieldValue(3),fieldValue(4),id))

не лучший образец кода, однозначно ))

> w " /строим базовую часть"
Желательно, чтобы у системных утилит был режим "тихого" выполнения, с возвратом
результатов через переменную и %Status

> g skipRecord
Про goto внутри цикла все знают, да ))

И вообще, while для обхода глобали или курсора это зло. Лучше обходить через
for, тогда такие извращения не потребуются.

> s res=$lb(count,countMissIndex)
у таких методов лучше возвращать нормальный %Status, а результирующие переменные
возвращать по ссылке

> openFile(file)
> {q:file=*0*
> c file o file:"NW":*1*
> w:'$test "Файл ",file," не открыт"
> u:$test file
> }
Тоже вместо нормальной обработки ошибок через try\catch или status непонятно
что. Этим, кстати, грешат и почти все "старые" консольные утилиты Интерсистемс.

Любви.
=Сергей Шутов
ООО Димас, Хабаровск
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421962
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
logist, раз пошла такая пьянка про вторую программу - задача была в том, чтобы проверить корректность индексов без удаления текущих (ибо иногда это означает выведение из строя сервера надолго, а также не дает ответа - были ли ошибки в структуре индексов).
BuildIndices и PurgeIndices не подходят.

>1. Если все равно работаем с классами, нафига еще использовать программы?
Работаем с глобалами.Класс чтоли подразумевает единство какое-то данных и методов. Если программа работает сама по себе, то зачем ее пихать в класс? Получим то же извращение, что и в яве.

>2. Зачем ходить по oddCOM напрямую, когда есть для этого интерсистемовские макросы?
Какие?
Мне проще самому разобрать oddCOM, чем найти что-то в документации.

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

try catch кажется в каше 5.2 еше нет, поэтому и "грешат" этим старые утилиты :-)))

>> w " /строим базовую часть"
>Желательно, чтобы у системных утилит был режим "тихого" выполнения
В моем случае нужно как раз сообщение о том, в каком месте была ошибка в индексе.
Возраты статуса не нужны, программа не предназначена для автоматического запуска, нужен вывод в файл/терминал.
--------------------------------------------------------------
nonalexandro - я как-то посмотрел в форуме код на оракле, чуть не вырвало, да :-)

PS
А еще программирование на каше для меня скорее хобби, чем обязанность ;-)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35421963
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, ну еще программа брошена недописанной по принципу - ну у меня работает и ладно.
Что видно по методу normalizeData

;-)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422002
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
non-alexandroСтранно что вообще 50т.р. предложили....
Покажи свой. Будет на кого равняться...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422004
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. , если бы ты работал в моем отделе - переписывал бы код однозначно. Т.ч. все это очень спорно...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422014
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan.Kokov non-alexandroКод cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...

Позвольте полюбопытствовать, как вы это поняли?
По собственным эстетическим принципам. Разным мужчинам нравятся различные типы женщин. COS - не для меня, уж очень угловато и неотёсанно...
Ну это конечно оффтоп.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422017
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
non-alexandroCOS - не для меня, уж очень угловато и неотёсанно...
Что "не для тебя" это ладно... Но про "угловат" и "неотесан" это посмешило... На других языках буквы наверное смотрятся круглее и глаже?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422038
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa non-alexandroCOS - не для меня, уж очень угловато и неотёсанно...
Что "не для тебя" это ладно... Но про "угловат" и "неотесан" это посмешило... На других языках буквы наверное смотрятся круглее и глаже?
У языка есть понятие выразительность.
Для меня код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WebRequest := Object clone do(
	handleSocket := method(aSocket,
		aSocket streamReadNextChunk
		request := aSocket readBuffer betweenSeq("GET ", " HTTP")
		f := File with(request) 
		if(f exists, f streamTo(aSocket), aSocket streamWrite("not found"))
		aSocket close
	)
)

WebServer := Server clone do(
	setPort( 8000 )
	handleSocket := method(aSocket, 
		WebRequest clone @handleSocket(aSocket)
	)
)

WebServer start
гораздо понятнее чем тот, что используется в каше.
При этом язык, на котором написан код, мне практически не известен.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422041
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
logist
спасибо за $ZOBJCLASSMETHOD, я не знал, что так можно, действительно красивее.

Код: plaintext
1.
2.
s:indexLength= 4  
flagOK=$d(@indexStorage@(index,fieldValue( 1 ),fieldValue( 2 ),fieldValue( 3 ),fieldValue( 4 ),id))
конечно коряво написано, тем более чревато откровенными ошибками, если длина индекса больше того, что заложено в программе. А как можно лучше, при этом не извращаясь больше необходимого и не теряя в скорости?

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

----------
nonalexandro
мне кажется я пишу в стиле ближе к С и кажется довольно читаемо (форматирование поехало конечно)
Я видел коды написанные практически в стиле Int-рутин классов, вот это жесть.
А вообще язык это набор операторов - кирпичей. А чего и как вы из них построить - зависит от тех, кто строит :-)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422050
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПри этом язык, на котором написан код, мне практически не известен.
:-)

А вот меня VisualBasiс раздражает просто.
Жидкий кисель, употреблять невозможно, то что можно написать одной строкой - надо писать пятью.
Тем более начинаешь писать - просто раздражает своими выкидонами.
(Использовал в экселе - редактор атас, строку большую ему не сделай, оператор недописал и перешел на другую строку - вопит об ошибке, просто подсветить то не судьба)

Так что видимо каждому свое :-)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422056
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa

Код: plaintext
если бы ты работал в моем отделе - переписывал бы код однозначно.  Т.ч. все это очень спорно...
Спорно, спорно...
В таких боях я гораздо чаще выигрываю, чем проигрываю.
А как бы вы например написали, то есть что по вашему не так в моем коде?

/
Какая-то большая стирка :-)
Но думаю, в любом случае от этого польза будет
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422064
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.А вот меня VisualBasiс раздражает просто...
Так что видимо каждому свое :-)
Как я вас понимаю (с)
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422151
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.А как бы вы например написали, то есть что по вашему не так в моем коде?
Я только про стилистику... Например про вот этот кусок:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 /*Собирает информацию о хранении в специальную переменную storageIndex*/
buildStorageIndex(class)[storageIndex]  
 {k storageIndex
  s storage=$o(^oddCOM(class,"s","Default","D",""))
  while storage'=""
      {
       s storageType=$g(^oddCOM(class,"s","Default","D",storage,22),"listnode")
	   if storageType="listnode"
	       {s i=$o(^oddCOM(class,"s","Default","D",storage,"V",""))
		    while i'=""
               {s field=^oddCOM(class,"s","Default","D",storage,"V",i, 21 )
                s type=$g(^oddCOM(class,"a",field, 40 ))
                s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
                s storageIndex(field)=$lb(i,subscript,storageType,type)
	            s i=$o(^oddCOM(class,"s","Default","D",storage,"V",i))
               }   
	       }     
	   if (storageType="subnode")||(storageType="node")
	       {s field=^oddCOM(class,"s","Default","D",storage, 21 )
            s type=$g(^oddCOM(class,"a",field, 40 ))
            s subscript=$g(^oddCOM(class,"s","Default","D",storage, 23 ))
            s storageIndex(field)=$lb(i,subscript,storageType,type)
	       }
	   s storage=$o(^oddCOM(class,"s","Default","D",storage))
      }
  q
 }
- Вот это
Код: plaintext
^oddCOM(class,"s","Default","D")
Записал бы в переменную...
- Операторные скобки открываю в той же строке, что и оператор, а закрываю на уровне с оператором.
Примеры:
Код: plaintext
1.
2.
3.
4.
if a= 0  {
}
...
while b< 10  {
}
- Многострочные "куски" разбил бы на процедуры или функции...
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422628
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если записать
^oddCOM(class,"s","Default","D")
в переменную, а потом работать с переменной, то теряется прозрачность кода, хуже видно, что же мы на самом деле обращаемся. Мой код несмотря на громоздкость будет читаться лучше.

автор- Операторные скобки открываю в той же строке, что и оператор, а закрываю на уровне с оператором.
Руки с корнем за такое вырывать. Непонятно кто это придумал, но по ощущению код становится намного хуже читаемым. Особенно это применительно к каше, где в версии 4.1 при экспорте-импорте удалялись отступы и код каше превращался в нечитаемую кашу.

авторМногострочные "куски" разбил бы на процедуры или функции.
Механическое разбиение только по признаку объемности - зло еще большее, чем все лепить в одну кучу, в итоге программа становится еще запутанней.

Есть контекст, в рамках которого выполняются действия, этот контекст нужен для всех этих
действий. Если этот контекст механически таскать из функции в функцию (из-за неверного дробления), то теряется прозрачность, непонятно что откуда берется.

Так что если алгоритм именно логически не получилось разделить на части, механическое дробление его на несколько функций противопоказано.

В моем случае алгоритм я не вижу, как разделить алгоритм на независимые части, да и объемность его только кажущаяся. Если присмотреться, то очень большой объем занимает инициализация переменных и пухлые куски кода типа
Код: plaintext
 s:indexLength= 1 ....    s:indexLength= 2       s:indexLength= 3  
которые выполняют на самом деле один шаг алгоритма.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422694
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н. , вот видиш какие у нас "непримиримости".
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422704
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я за скобки кого хошь покусаю!
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35422717
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
non-alexandroКод cache и эстетичность находятся в разных измерениях... Им не суждено встретиться... Никогда...

Не, в редакторе каше бывает вполне симпатично.
А вот на сайте да.... Страшненько. Тем более вам синтаксис непривычен.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35423515
non-alexandro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.
Не, в редакторе каше бывает вполне симпатично.
А вот на сайте да.... Страшненько. Тем более вам синтаксис непривычен.
С кашой работал несколько месяцев, в компании здешних завсегдатаев (кстати, привет!). К синтаксису действительно сложно привыкнуть - очень много рудиментальных вещей, тянущихся со времен, когда компы были слабыми и беспомощными :) Обязательные set do и т.п. в начале вызова метода/установке значения переменной. Если не следить, очень просто написать программу, которую никто не поймет.
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35423990
Ivan.Kokov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.если записать
^oddCOM(class,"s","Default","D")
в переменную, а потом работать с переменной, то теряется прозрачность кода, хуже видно, что же мы на самом деле обращаемся. Мой код несмотря на громоздкость будет читаться лучше.

А если переменной дать вполне осмысленное имя?
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424391
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант я бы написал так (писал не вдаваясь в подробности оптимизации):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
simplyRebuild(file= 0 ) //перестроить все индексы средствами каше
{
	d openFile(file)
	s class=$$$comClassNext("A")
	while class'="" {
		if $$$classIsPersistent(class) {
			w !,"Перестройка индесов ",class
			d $zobjclassmethod(class,"%BuildIndices","",1)
		}
		s class=$$$comClassNext(class)
 	}
 	q 
}

checkAll(repair=0,file=0) public 
{
	d openFile(file)
	s class=$$$comClassNext("A")
	while class'="" {
		d:$$$classIsPersistent(class) checkClass(class,repair)
		s class=$$$comClassNext(class)	
	}
	q
} 

Или такой вариант (мне он больше нравится):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
simplyRebuild(file= 0 ,class="A") //другой вариант
{
	d openFile(file)
 	d {
		s class=$$$comClassNext(class)
		continue:(class="")||'$$$classIsPersistent(class)
		w !,"Перестройка индесов ",class
		d $zobjclassmethod(class,"%BuildIndices","",1)
 	} while class'=""
 	q
}

checkAll(repair= 0 ,file= 0 ,class="A") public //другой вариант
{
	d openFile(file)
 	d {
	 	s class=$$$comClassNext(class)
	 	continue:(class="")||'$$$classIsPersistent(class)
	 	d checkClass(class,repair)
 	} while class'=""
	q
} 

 //Комплексная проверка для класса
checkClass(class,repair= 0 ,file= 0 ) public 
{
	d openFile(file)
	if '$$$comMemberDefined(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet) {w !,"Класс ",class," не существует или имеет нестандартное хранение" q}
	w !,"Проверка индексов для класса:",class
  
	d checkIndexExist(class,repair)
	d checkIndexCorrect(class,repair)  
	q
}
 
 // проверяет индексные записи на корректность. Пока не проверяет доп-поля                                  
checkIndexCorrect(class,repair=0,file=0)[storageIndex] public
{
	n storageIndex
	d openFile(file)
	if '$$$comMemberDefined(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet) {w !,"Нестандартное хранение или неверный класс" q}
	s dataStorage=$$$comMemberKeyGet(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet,$$$cINDEXdata)
	s indexStorage=$$$comMemberKeyGet(class,$$$cCLASSstorage,$$$nameDefaultStorageNameGet,$$$cINDEXextent)
	d buildStorageIndex(class)
	s index=$$$comMemberNext(class,$$$cCLASSindex,"") //собираем индексные поля
	while index'="" {
		//удалим из списка проверки idkey
		continue:$$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXidkey)
		
		s indexLength(index)=$$$comMemberKeyNext(class,$$$cCLASSindex,index,$$$cINDEXproperty)
		f i=1:1:indexLength(index) s indexField(index,i)=$$$comSubMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXproperty,i,$$$cINDEXPROPproperty)

		//собираем дата-поля от индекса	   
		s indexDataList=$p($$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXcompilationsignature),"~",4)
		s indexDataLength(index)=$l(indexDataList,",")
		s:indexDataList'="" indexDataLength(index)=indexDataLength(index)+ 1 

		s indexData(index, 1 )="%%CLASSNAME"
		f i= 1 : 1 :indexDataLength(index) s indexData(index,i+ 1 )=$p(indexDataList,",",i)

		s index=$$$comMemberNext(class,$$$cCLASSindex,index)
	}
	...
	q
 }

Мне кажется, что так более эстетично и читабельно...
А про операторы - язык такой, какой он есть! Другого не дано.. :)

ЗЫ: Для макросов подключаем инки: #Include %systemInclude
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424411
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, с макросами пожалуй лучше.

Только где найти документацию про макросы?
Без знания макросов даже читать готовый код с ними читать тяжелее.

Код: plaintext
1.
2.
3.
4.
while index'="" {
    continue:$$$comMemberKeyGet(class,$$$cCLASSindex,index,$$$cINDEXidkey)
    /*****/
    s index=$$$comMemberNext(class,$$$cCLASSindex,index)
    }
- повиснет
...
Рейтинг: 0 / 0
требуется Ведущий разработчик Cache (Москва)
    #35424440
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.Только где найти документацию про макросы?
Мне как-то Жохов Николай присылал. Но у меня недавно диск погорел... И все, что нажито непомерным трудом... Все же погибло! (с) к/ф Иван Васильевич меняет профессию
...
Рейтинг: 0 / 0
25 сообщений из 76, страница 2 из 4
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / требуется Ведущий разработчик Cache (Москва)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]