Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Секреты бизнеса. Предприниматели рассказывают..." на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Создаем свою информационную систему
Информационный Канал Subscribe.Ru |
Создаем свою информационную систему
Выпуск 4
Печально… Я думал дело обстоит несколько лучше. Итак, всего восемь писем из потенциальных 5700. Если я не ошибаюсь, это 0.14%. А остальные?
Т.е. получается, что я был неправ на 0.14 %. Признаю.
Больше всего меня порадовало следующее письмо:
-------------цитата ----------------------------------
Приветствую Михаил!
Ты достал! Я сегодня же откажусь от твоей рассылки. Если ты исписался в ноль, и не можешь найти чем заняться, то это твои проблемы.
Существуют общие правила построения информационных систем (ИС). ИС это форма, с ней
проблем нет. Ты думай как обеспечить безглючную работу с наполнением ИС.
С уважением,
Павел Вершинин
--------- конец цитаты -----------------------------
По крайней мере, это честно и от души.
Хочется немного отвлечься и сказать пару слов на тему эволюции, как мне она видится.
Думается что, человек проходит в своем развитии несколько стадий.
Рождение, ну тут от нас мало что зависит.
Устойчивая (фиксированная) точка зрения. Не совсем понятно как, но мы почти все оказываемся в этой позиции уже в 12-14 лет. И очень многие остаются в ней всю оставшуюся жизнь. Основная характеристика этой позиции – гнев, невозможность принять чужую точку зрения, наличие стрессов, тяга к накоплению знаний.
Потеря фиксации- стадия, когда человек способен воспринимать одновременно больше (много больше) одной точки зрения. Основная характеристика стадии – крепкое здоровье, отсутствие стрессовых ситуаций. Мне совершенно непонятно, почему этому не учат всех, но это факт. У нас даже есть специальные профессии, для которых это основная функция смотреть на ситуацию с разных точек зрения. Пример придумайте сами.
Знаки – стадия, когда человек начинает видеть знаки, которые ему преподносит жизнь. Знак - это статистически маловероятная ситуация. Могу привести пример совсем недавнего знака… Установили новую версию системы на одном из компьютеров у заказчика. Перегрузили компьютер. Он запускается и оказывается, что изображение на экране перевернуто на 180 градусов. Пока мы на это дело тупо смотрели, пока искали фотоаппарат, чтобы такое чудо заснять... Плохо припаркованная газель катится и въезжает в хорошо припаркованный новенький директорский форд. Согласитесь, что каждое событие в отдельности редкое, но вероятное. А вот два и одновременно – это что-то запредельное. Что же этот знак значит? Пока еще не понял, но уже скоро.
Феномены – ситуация, когда происходят события необъяснимые с точки зрения современного уровня понимания общества. Типичные примеры – это вещие сны, видения, предвидения будущих событий и т.д.
Путь – это, видимо, то, что называется просветлением. Я думаю, лучше, чем восточные философы это все равно не определить.
К чему это я? А вот к чему. Если кто-то ждет, что найдет здесь новых знаний – то совершенно зря. Все что я могу сделать это показать, как ситуация с разработкой информационных систем выглядит с немного другой точки зрения. Не с той, которой учат в институте, а с точки зрения практики. Я сто раз соглашусь с Ю. Морозом (на сайте есть пара его книг) в том, что нет никакого смысла копить гору бесполезных ключей от дверей, которые уже кто-то открывал. Потому как та дверь, которую придется открывать вам, все равно имеет другой замок. Надо просто научиться делать замки.
Но главное не в этом. Пока вы сами не начнете бороться со своим «фиксированным» взглядом на мир никто не сможет помочь.
Теперь еще одно письмо.
-------------цитата ----------------------------------
Здравствуйте!
Получив прошлый выпуск рассылки, сначала подумал, что это шутка. А сегодня, увидев в почте (цитата):
"Насколько я понимаю, пока сделать это смог только один человек, и тот мой хороший знакомый, а как же остальные "читатели"?",
заподозрил, что все это предлагается на полном серьезе.
Вообще-то практически любой человек, мало-мальски изучавший информатику, рано или поздно непременно сталкивается с темой ретроспективных программ. Это так же неизбежно, как хрестоматийные "задача о 8 ферзях", всевозможные сортировки и т.д. И предлагать профессионалу такие задачи столь же нелепо, как бросить вызов: "А слабо написать программу "Hello, world"???". А потом удивляться, почему только один человек прислал решение, да и тот знакомый. Конечно, себя уважать нужно, но не до такой же степени, чтобы остальных полными дураками считать, если они не повелись на такой призыв.
Кстати, вот здесь: http://www.nyx.net/~gthompso/quine.htm собраны "квайны" на нескольких десятках языков. Тут же есть ссылка на подборку программ "Hello, world", может пригодиться для будущих рассылок.
P.S. Если единственная цель данной рассылки - лишь показать всем, какой я умный и какие все остальные дураки, тема выбрана крайне неудачно. Результат может оказаться совсем иным.
--------- конец цитаты -----------------------------
Когда прочитал, вспомнился мне фильм, кажется про академика Павлова. Там есть такой эпизод, когда мальчика в монастыре учат сажать капусту. Сажать надо корнями вверх, говорят ему. Когда приходят проверять. Вся капуста посажена правильно – корнями вниз. Батюшка качает головой и говорит. «Главное не результат – главное послушание».
Ну почему мы всегда все предполагаем исходя из своей точки зрения? Кто нас этому научил, и главное зачем?
Все с философией на время закончили. Приступаем к обсуждению решения.
Я сначала опубликую свой вариант решения. Он хорош тем, что его можно проверить даже в Microsoft Office.
Option Explicit
Private a(1 To 17) As String
Private Function TT(ByVal s As String) As String
TT = Replace(s, Chr(34), Chr(34) & Chr(34))
End Function
Public Sub Main()
LoadData
Dim i As Long
For i = 1 To 16
Debug.Print a(i)
Next
For i = 1 To 17
Debug.Print " a(" & i & ") = " & Chr(34) & TT(a(i)) & Chr(34)
Next
Debug.Print a(17)
End Sub
Private Sub LoadData()
a(1) = "Option Explicit"
a(2) = "Private a(1 To 17) As String"
a(3) = "Private Function TT(ByVal s As String) As String"
a(4) = " TT = Replace(s, Chr(34), Chr(34) & Chr(34))"
a(5) = "End Function"
a(6) = "Public sub Main()"
a(7) = " LoadData"
a(8) = " For i = 1 To 16"
a(9) = " Debug.Print a(i)"
a(10) = " Next"
a(11) = " For i = 1 To 16"
a(12) = " Debug.Print "" a("" & i & "")="" & Chr(34) & TT(a(i)) & Chr(34)"
a(13) = " Next"
a(14) = " Debug.Print a(17)"
a(15) = "End sub"
a(16) = "Private Sub LoadData()"
a(17) = "End Sub"
End Sub
Есть еще один важный момент. Если посмотреть на программу внимательно, то становится ясно, что она состоит из двух сегментов. Код генерации и блок данных. В нашем случае они практически одинаковы по размеру. Просто потому что таково условие задачи. Код генерации очень маленький. Почти все место занимает блок подготовки данных. Объем данных пропорционален результату, а вот сам блок генерации фиксирован и занимает, в общем и целом, десяток строк.
К чему я нас подвожу? А вот к чему:
Сложность создания генератора сопоставима со сложностью создания приложения, которое он создает. Можно это даже проще сформулировать. Если вы написали программу один раз, то чтобы сделать генератор, который будет генерировать аналогичную программу нужно потратить фиксированное и очень небольшое время.
Я хочу закончить цитатами из еще одного письма.
-------------цитата ----------------------------------
Здравствуйте, Михаил!
Высылаю Вам решение задачи про программу, печатающую свой исходный текст, на Visual Basic.
Вернее, два решения:
- первое - генерация кода без использования внешних данных, как в условии;
- второе - печать файла с исходником программы, который лежит в той же папке.
Второе мне было интересно сделать для сравнения объема кода, потому что при "честной" кодогенерации фактически код пришлось дублировать. Разница получилась примерно в 10 раз, пусть и в такой чисто теоретической задаче. Это показывает перспективность систем кодогенерации, основанных на использовании метаданных. :-)
Кстати, я предложил бы использовать в качестве характеристики, оценивающей КДП кодогенератора, не объем кода, а время:
1. Потраченное на разработку собственно генератора.
2. Которое было бы затрачено на разработку генерируемого кода при "прямом" программировании.
3. Затраченное на заполнение метаданных.
Время - потому что наша конечная цель - сократить трудовые затраты на разработку, к тому же очевидно, что код генератора будет значительно сложнее и "интеллектуальнее" кода генерируемого, поэтому прямое сравнение объема здесь не очень подходит.
Я занимаюсь задачей сходной тематики, только вместо генерации кода у нас используется динамическое создание приложений на основе описания в БД. Больше всего времени, как, наверное, и у Вас, ушло на реализацию дизайнера, в котором эти динамические приложения разрабатываются.
Одно преимущество такой модели перед генерацией кода - возможность прозрачно для пользователей выкатывать новую версию приложения и исправлять ошибки (практически так же, как выкатка веб-сайта, только вместо файлов - таблицы и хранимые процедуры).
С уважением, Роман Шеховцов.
-------------------------------------
Первый вариант (как в условии задачи):
Option Explicit
Sub main()
Dim strStart As String
Dim strEnd As String
Dim strProc As String
strStart = _
"Option Explicit" & vbNewLine & _
vbNewLine & _
"Sub main()" & vbNewLine & _
" Dim strStart As String" & vbNewLine & _
" Dim strEnd As String" & vbNewLine & _
" Dim strProc As String" & vbNewLine
strEnd = _
" Debug.Print strStart" & vbNewLine & _
" Debug.Print strDecode(strStart, ""strStart"")" & vbNewLine & _
" Debug.Print strDecode(strEnd, ""strEnd"")" & vbNewLine & _
" Debug.Print strDecode(strProc, ""strProc"")" & vbNewLine & _
" Debug.Print strEnd" & vbNewLine & _
" Debug.Print strProc" & vbNewLine & _
"End Sub" & vbNewLine & _
vbNewLine
strProc = _
"Private Function strDecode(str As String, strName As String) As String" & vbNewLine & _
" Dim arr() As String" & vbNewLine & _
" arr = Split(str, vbNewLine)" & vbNewLine & _
vbNewLine & _
" strDecode = vbTab & strName & "" = """ & vbNewLine & _
vbNewLine & _
" Dim i As Long" & vbNewLine & _
" For i = LBound(arr) To UBound(arr) - 1" & vbNewLine & _
" strDecode = strDecode & "" _"" & vbNewLine & vbTab & vbTab" & vbNewLine & _
" If arr(i) <> """" Then" & vbNewLine & _
" strDecode = strDecode & """""""" & Replace(arr(i), """""""", """""""""""") & """""" & """ & vbNewLine & _
" End If" & vbNewLine & _
" If i < UBound(arr) - 1 Then" & vbNewLine & _
" strDecode = strDecode & ""vbNewLine &""" & vbNewLine & _
" Else" & vbNewLine & _
" strDecode = strDecode & ""vbNewLine"" & vbNewLine" & vbNewLine & _
" End If" & vbNewLine & _
" Next i" & vbNewLine & _
vbNewLine & _
"End Function" & vbNewLine
Debug.Print strStart
Debug.Print strDecode(strStart, "strStart")
Debug.Print strDecode(strEnd, "strEnd")
Debug.Print strDecode(strProc, "strProc")
Debug.Print strEnd
Debug.Print strProc
End Sub
Private Function strDecode(str As String, strName As String) As String
Dim arr() As String
arr = Split(str, vbNewLine)
strDecode = vbTab & strName & " = "
Dim i As Long
For i = LBound(arr) To UBound(arr) - 1
strDecode = strDecode & " _" & vbNewLine & vbTab & vbTab
If arr(i) <> "" Then
strDecode = strDecode & """" & Replace(arr(i), """", """""") & """ & "
End If
If i < UBound(arr) - 1 Then
strDecode = strDecode & "vbNewLine &"
Else
strDecode = strDecode & "vbNewLine" & vbNewLine
End If
Next i
End Function
-------------------------------------
Второй вариант - печать файла:
Attribute VB_Name = "QuinsFromFile"
Option Explicit
Sub main()
Open App.Path & "\QuinsFromFile.bas" For Binary As #1
Dim str As String
Line Input #1, str
Debug.Print Input(LOF(1) - Loc(1), 1) End Sub
--------- конец цитаты -----------------------------
Мне думается, что Роман поднимает правильный вопрос, про который мы начнем разговор в следующем выпуске.
А пока я предлагаю посмотреть на подборку всевозможных генераторов кода на сайте http://www.codegeneration.net/
Крайне полезная подборка.
Ведущий рассылки: Михаил М. Баранов | |||
bami@realbh.ru | www.realbh.ru |
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.prog.murometz2 |
Отписаться
Вспомнить пароль |
В избранное | ||