LINUX.ORG.RU

Кажется я написал быдлокод.

 , , ,


0

1

Манипулирование счётчиком цикла внутри цикла, использование пары значений вместо флаговой переменной и прочее. В общем написал, буду завтра отлаживать. Есть два желания, первое оставить всё как и есть потому что долго очень писал, второе полностью переписать. (повышенная концентрация быдлокода в LoadClass). Щито поделать?

http://star-engineers.blogspot.ru/

' Gambas class file

  Public Speed As Integer ' скорость
  Public Parts As New PartUnitClass[] ' конечности лапы
  '1-8 лапы    9 голова     10 хвост
  
  Public TypeUnit As String ' наименование юнита
  
  Public OtherValues As New GroupUniversalValues ' дополнительные признаки юнита
  
  Public Tactics As Integer ' используемая тактика, нападать строем, нападать бегом, отойти подальше, 
  Public Formation As Integer ' где в строю идти, арьергард, авангард, правый фланг, левый фланг, охрана героя
  
  Public Group As Integer ' группа в которую входит юнит
  
  Public X As Integer
  Public Y As Integer ' координаты
  Public Z As Integer
  
  Public Writ As Integer ' текущий приказ
  Public WritTarget As Integer ' цель приказа
  Public WritX As Integer
  Public WritY As Integer ' координаты точки назначения из приказа, если равны нулю или достигнутым, то происходит новый расчёт
  Public WritZ As Integer
  
  'Public Sub _new()
  ' Dim p As New PartUnitClass
  ' Limb.Add(p) 
  'End

Public Function SaveClass() As String[]
  ' Сохраняет класс в виде массива строк
  Dim rData As New String[] ' массив для результата
  Dim a As Integer ' счётчик цикла
  Dim m As Integer ' ограничитель цикла
  
  Dim aParts As Integer
  Dim mParts As Integer ' для перебора частей
  Dim oValues As String[] ' дополнительные свойства объекта
  Dim PartData As String[] ' ссылка для массива с сохранением части
  
  
  rData.Add("begin unit") ' начало описания
  
  'сохранение основных свойств
  rData.Add("speed=" & LTrim(Str(Speed))) 'Speed
  rData.Add("type-unit=" & TypeUnit) 'TypeUnit
  rData.Add("tactics=" & LTrim(Str(Tactics))) 'Tactics
  rData.Add("formation=" & LTrim(Str(Formation))) 'Formation
  rData.Add("group=" & LTrim(Str(Group))) 'Group
  rData.Add("x=" & LTrim(Str(X))) ' X
  rData.Add("y=" & LTrim(Str(Y))) ' Y
  rData.Add("z=" & LTrim(Str(Z))) ' Z
  rData.Add("writ=" & LTrim(Str(Writ))) 'Writ
  rData.Add("writ-target=" & LTrim(Str(WritTarget))) 'WritTarget
  rData.Add("writ-x=" & LTrim(Str(WritX))) ' WritX
  rData.Add("writ-y=" & LTrim(Str(WritY))) ' WritY
  rData.Add("writ-z=" & LTrim(Str(WritZ))) ' WritZ  
  'rData.Add("=" & LTrim(Str())) '
  
  ' Сохранение дополнительных признаков юнита
  rData.Add "begin other-values"
  If OtherValues.Count > 0 Then
    'есть дополнительные свойства
    oValues = OtherValues.SaveClass ' получение массива строк с дополнительными свойствами юнита.
    m = oValues.Max
    For a = 0 To m
     rData.Add(oValues[a]) 
    Next
  Endif
  rData.Add("end other-values")
   
  ' Сохранение частей юнита 
  If Parts.Count = 0 Then
    ' частей и у юнита нет
    rData.Add("unit no-parts") ' У юнита нет частей
  Endif
  If Parts.Count > 0 Then
    ' У юнита есть части
    rData.Add("unit parts")  
    mParts = Parts.Max ' колличество частей
    For aParts = 0 To mParts
      PartData = Null ' очистка ссылки на массив
      PartData = Parts[aParts].SaveClass ' сохранение части в массив
      m = PartData.Max
      rData.Add("unit begin-part") ' начало описания части
      For a = 0 To m
        rData.Add(PartData[a])    'добавление строк части в массив
      Next
      rData.Add("unit end-part") ' конец описания части
    Next
        
  Endif
  rData.Add("end unit") ' конец описания
  Return rData ' возврат значения
End

Public Sub LoadClass(ByRef ArrayData As String[], Optional StartScan As Integer = 0, Optional StopScan As Integer = -1)
  ' Функция загружающая данные в класс из массива строк 
  ' Так же принимает начало и конец сканирования
  Dim a As Integer 
  Dim m As Integer
  Dim Stage As Integer
  Dim sData As New ClassStringData ' класс для операций со строковыми переменными
  Dim S As String ' текущая строка
  Dim OP As String ' оператор
  Dim Value As String ' значение
  
  Dim BeginOtherValues As Integer ' строка начала описания лрполнительных свойств
  Dim EndOtherValues As Integer ' строка окончания описания дополнительных свойств 
  Dim oValues As String[] ' ссылка на массив для дополнительных свойств
  
  Dim BeginPart As Integer ' начало описания части
  Dim EndPart As Integer ' конец описания части
  Dim PartIndex As Integer ' текущая часть
  Dim PartTMP As PartUnitClass ' временная переменная под текущую часть юнита
  
  If ArrayData = Null Then Return ' вместо массива переданна пустая переменная
  If ArrayData.Count = 0 Then Return ' Если в массиве нет элементов, то выйти
  
  m = StopScan
  If StopScan = -1 Then m = ArrayData.Max ' значение по умолчанию
  
  For a = StartScan To m
    S = ArrayData[a] ' текущая строка
    'перебор нужной части массива
    If Stage = 0 Then
      ' чтение базовых параметров класса
      OP = sData.GetOpS(S) ' извлечение оператора
      Value = sData.GetValueS(S) ' извлечение значения
      
      If OP = "speed" Then Speed = Val(Value) '  rData.Add("speed=" & LTrim(Str(Speed))) 'Speed
      If OP = "type-unit" Then TypeUnit = Value
      If OP = "tactics" Then Tactics = Val(Value) ' rData.Add("tactics=" & LTrim(Str(Tactics))) 'Tactics
      If OP = "formation" Then Formation = Val(Value) ' rData.Add("formation=" & LTrim(Str(Formation))) 'Formation
      If OP = "group" Then Group = Val(Value) ' rData.Add("group=" & LTrim(Str(Group))) 'Group
      If OP = "x" Then X = Val(Value) ' rData.Add("x=" & LTrim(Str(X))) ' X
      If OP = "y" Then Y = Val(Value) ' rData.Add("y=" & LTrim(Str(Y))) ' Y
      If OP = "z" Then Z = Val(Value) ' rData.Add("z=" & LTrim(Str(Z))) ' Z
      If OP = "writ" Then Writ = Val(Value) ' rData.Add("writ=" & LTrim(Str(Writ))) 'Writ
      If OP = "writ-target" Then WritTarget = Val(Value) ' rData.Add("writ-target=" & LTrim(Str(WritTarget))) 'WritTarget
      If OP = "writ-x" Then WritX = Val(Value) ' rData.Add("writ-x=" & LTrim(Str(WritX))) ' WritX
      If OP = "writ-y" Then WritY = Val(Value) ' rData.Add("writ-y=" & LTrim(Str(WritY))) ' WritY
      If OP = "writ-z" Then WritZ = Val(Value) ' rData.Add("writ-z=" & LTrim(Str(WritZ))) ' WritZ  
      
      If OP = "begin other-values" Then Stage = 1 ' начались дополнительные свойства
      
    Endif
    If Stage = 1 Then
      ' считывание дополнительных свойств
      If sData.GetOpS(S) = "begin other-values" Then BeginOtherValues = a ' начало описания дополнительных свойств
      EndOtherValues = sData.FindStringIndex(ArrayData, "end other-values", BeginOtherValues, m) ' поиск окончания описания дополнительных типов
      oValues = sData.CopyStringArray(ArrayData, BeginOtherValues, EndOtherValues) ' копирование нужного куска в другой массив
      OtherValues.LoadClass(oValues) ' загрузка массива дополнительных свойств
      Stage = 2 ' Стадия окончена
      a = EndOtherValues ' передвинуть счётчик что бы не просматривал уже загруженные данные
    Endif
    If Stage = 2 Then
      ' Стадия 2 Загрузка частей юнита
      If sData.GetOpS(S) = "unit no-parts" Then
        Stage = 4 ' У юнита нет частей, стадия 4
      Endif
      If sData.GetOpS(S) = "unit parts" Then
        ' У юнита есть части
        Stage = 3 
      Endif
       
    Endif
    If Stage > 2 Then Break ' Если уже не вторая стадия, прервать цикл 
    ' Довольно быдлокодское решение, но я сегодня явно не в форме.
    ' Я решил сократить данный цикл что бы этот быдлокод минимально влиял на выполнение программы.
    ' Думаю Стадию 1 стоит переписать в дальнейшем и вынести за пределы цикла.
    
  Next
  Parts.Clear ' очистка массива с частями
  
  If Stage = 3 Then
    ' добавление частей
    a = EndOtherValues + 1 ' начинаем считать с конца описания дополнительных свойств
    m = sData.FindStringIndex(ArrayData, "end unit", a, m) ' поиск конца описания класса в массиве
    If m = -1 Then m = StopScan
    If m = -1 Then m = ArrayData.Max ' защита от дурака который не внесёт в файл "end unit"
    
    
      
    Do
      S = ArrayData[a]
      If sData.GetOpS = "unit begin-part" Then
        BeginPart = sData.FindStringIndex(ArrayData, "unit begin-part", a, m) ' поиск начала текущей части
        EndPart = sData.FindStringIndex(ArrayData, "unit end-part", a, m) ' поиск конца текущей части
        'Как это работает... Я только что написал и уже забыл.
        'Вообще это оптимизация, я так рассудил что лучше установку переменных BeginPart и EndPart
        'Проводить только при нахождении строки "unit begin-part" . А всякий мусор между "unit end-part" и "unit begin-part"
        'Не рассматривать, всё равно там могут быть разве что комментарии
      Endif  
      
      ' Здесь могло бы быть рассмотрение того что находиться между "unit end-part" и "unit begin-part"
      
      If BeginPart <> -1 And EndPart <> -1 Then
        ' часть найдена
        PartTMP = Null ' обнулить на всякий случай
        PartTMP = New PartUnitClass ' создать новую часть для юнита
        PartTMP.LoadClass(ArrayData, BeginPart, EndPart) ' загрузить часть во временную переменную
        Parts.Add(PartTMP) ' добавить часть в массив
        a = EndPart ' передвинуть счётчик
        BeginPart = -1 ' Знаю быдлокод
        EndPart = -1 ' Это устанавливает значения в такое положение дабы операция не повторилась ещё раз до установки BeginPart и EndPart
      Endif
      a = a + 1 ' увеличить счётчик на 1
    Loop Until a > m ' выйти из цикла если счётчик больше ограничителя
  Endif

End
☆☆☆

Последнее исправление: rezedent12 (всего исправлений: 1)

Ответ на: комментарий от CrossFire

Кстати, если читают админы, перенесите в толксы, пожалуйста. Я как то сразу не подумал что такую простыню кода в /dev лучше не писать.

rezedent12 ☆☆☆
() автор топика
Ответ на: комментарий от rezedent12

Стоит ли полностью переписать

Gambas

Ну ты понял.

fenris ★★★★★
()
Ответ на: комментарий от wakuwaku

Это же бейсик, так что всё нормально.

Да? Выглядит намного лучше, чем код на C++ или Java от мастеров.

anonymous
()
Ответ на: комментарий от fenris

Код на бейсике вполне можно использовать в качестве прототипа, но исправлять по ходу, когда становятся очевидны недостатки. Есть такое замечательное понятие как рефакторинг, изначально выбранные методы могут оказаться не такими уж хорошими решениями.

wakuwaku ★★★★
()
Ответ на: комментарий от wakuwaku

Но ведь есть гораздо более лучшие языки для прототипирования.

fenris ★★★★★
()

Спросил у гугля «в гамбасе всё настолько печально, что даже сериализацию приходится костылить?» Гугль выплюнул это. Похоже, что таки да. Незря мелкомягкие закопали не.NET-овый диалект.

x3al ★★★★★
()

К блогспоту же прикручивается подсветка синтаксиса и форматирование кода.

PS. Не нужно комментировать каждую строку кода.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

К блогспоту же прикручивается подсветка синтаксиса и форматирование кода.

Как это сделать?

PS. Не нужно комментировать каждую строку кода.

Иначе сам запутаюсь.

rezedent12 ☆☆☆
() автор топика
Ответ на: комментарий от rezedent12

Перепиши еще раз, если есть желание. Две-три итерации и появится чувство удовлетворения, возможно, даже эротического характера :)

Quadmonster
()
Последнее исправление: Quadmonster (всего исправлений: 1)
Ответ на: комментарий от anonymous

C++ для лохов, Бейсик - выбор мастеров.

queen3 ★★★★★
()
Ответ на: комментарий от theNamelessOne

Ещё вариант — использовать gist'ы: http://developertips.blogspot.ru/2010/07/syntax-highlighting-on-blogger-gist....

Преимущества перед SyntaxHighlighter:

  • No setup required (in a previous post I documented how to setup syntaxhighlighter for blogger, it took me half an hour to setup everything correctly. Now with gist, there is zero setup required );
  • Faster to create code snippet in a post;
  • Supports more languages;
  • No need to worry about pasting XML, HTML, or other special characters;
theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)

То же самое на Common Lisp:

(defstruct location x y z)
(defstruct order type target location)
(defstruct unit speed parts type properties tactics formation group location order)

(defun save-unit (unit filename)
  (with-open-file (out filename :direction :output :if-exists :supersede)
    (with-standard-io-syntax
      (print unit out))))

(defun load-unit (filename)
  (with-open-file (in filename)
    (with-standard-io-syntax
      (read in))))
anonymous
()

Щито поделать?

Прекратить это нелепое самолюбование.

Есть два желания, первое оставить всё как и есть потому что долго очень писал, второе полностью переписать.

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

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.