Da Du VB6 kannst, schreibt das doch kurz angedeutet mal hinSophus hat geschrieben:Wo in welchem Abschnitt wüsste ich jetzt natürlich nicht

Da Du VB6 kannst, schreibt das doch kurz angedeutet mal hinSophus hat geschrieben:Wo in welchem Abschnitt wüsste ich jetzt natürlich nicht
Code: Alles auswählen
Sub Cmd_Berechnen_Click()
If Text1.Text ="" Then
Msgbox "Bitte geben Sie eine Zahl ein"
Else
Call BMI_Rechnung
End If
End Sub
Sub BMI_Rechnung ()
'Hier kommt dann die Formel hin
'Mit dem Zeichen (') gilt es in VB6 als Kommentar
End Sub
Code: Alles auswählen
#!/usr/bin/env python
import sys
from PyQt4 import uic
from PyQt4.QtGui import QApplication
def calculate_bmi(height, weight):
return weight / height**2
class BMICalculator(object):
def __init__(self):
self.ui = uic.loadUi('bmi.ui')
self.ui.close_button.clicked.connect(self.ui.close)
self.ui.calculate_button.clicked.connect(self.on_calculate)
self.ui.show()
def on_calculate(self):
size = self.ui.height_input.value()
weight = self.ui.weight_input.value()
try:
result = str(calculate_bmi(size, weight))
except ZeroDivisionError:
result = ''
self.ui.bmi_output.setText(result)
def main():
application = QApplication(sys.argv)
bmi_calculator = BMICalculator()
sys.exit(application.exec_())
if __name__ == '__main__':
main()
Und genau das ist das Problem, welches ich zu Beginn angeprangert habeSophus hat geschrieben:Und genau das findet man in VB selten.
Code: Alles auswählen
#!/usr/bin/env python
import pytest
def test_calculate_bmi_with_valid_values_returns_bmi():
expected = 23.37
result = calculate_bmi(1.85, 80)
assert abs(result - expected) < 0.01
def test_calculate_bmi_with_zero_height_raises_exception():
with pytest.raises(ZeroDivisionError):
calculate_bmi(0, 1)
Code: Alles auswählen
nelson@vitory ~/Source/Python/Snipptes/Forum/BMI % py.test -v bmi.py
======================== test session starts =======================
platform linux -- Python 3.4.0 -- py-1.4.20 -- pytest-2.5.2 -- /usr/bin/python
collected 2 items
bmi.py:10: test_calculate_bmi_with_valid_values_returns_bmi PASSED
bmi.py:15: test_calculate_bmi_with_zero_height_raises_exception PASSED
====================== 2 passed in 0.01 seconds ===================
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainDialog</class>
<widget class="QDialog" name="MainDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>210</width>
<height>129</height>
</rect>
</property>
<property name="windowTitle">
<string>BMI Calculator</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::ExpandingFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="height_label">
<property name="text">
<string>Height</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QDoubleSpinBox" name="height_input">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="suffix">
<string>m</string>
</property>
<property name="decimals">
<number>2</number>
</property>
<property name="maximum">
<double>999.990000000000009</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="weight_label">
<property name="text">
<string>Weight</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="bmi_label">
<property name="text">
<string>BMI</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="bmi_output">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="weight_input">
<property name="buttonSymbols">
<enum>QAbstractSpinBox::NoButtons</enum>
</property>
<property name="specialValueText">
<string/>
</property>
<property name="suffix">
<string>kg</string>
</property>
<property name="decimals">
<number>1</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="calculate_button">
<property name="text">
<string>Calculate</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="close_button">
<property name="text">
<string>Close</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
Man muss gar nichts - aber man sollte! Unit Tests haben sich in vielen vielen Projekten bewährt. Schau Dir mal erfolgreiche Open Source Projekte an und Du wirst sehen, dass die aller meisten davon Unit Tests (und ggf. andere automatisierte Tests) besitzen. Hier mal am Beispiel Bottle aufgezeigt (ein beliebtes "Micro"-Webframework). Ohne es zu geprüft zu haben, würde ich sagen, dass dort deutlich mehr Zeilen Code für die Tests existieren als für den eigentlichen Code.Sophus hat geschrieben:Muss ich denn jedesmal, bei jedem anderen Projekt einen automatisierten Test schreiben?
Man kann auch umgekehrt vorgehen und erst den Test und dann den Code schreiben. Diesen Ansatz nennt man dann Test Driven Development.Sophus hat geschrieben: Das hieße ja für mich doppelte Arbeit. Erst schreibe ich mein Programm, und dann einen Test.
Letztlich ja. Aber der Vorteil ist, dass Du schnell Feedback bekommst, wenn Du etwas an einer Stelle durch eine Änderung an einer vollkommen anderen Stelle "kaputt" gemacht hast. Das ist bereits bei vermeintlich kleinen Projekten ein enormer Vorteil. Lies Dir doch mal etwas dazu durchSophus hat geschrieben: Und je umfangreicher das Programm wird, desto umfangreicher die automatisierte Tests, die ich dann schreiben muss.
Das hat doch BlackJack in seinem Beispiel gezeigt. Du musst einfach in dem Programmteil, der beim Auslösen eines Events aufgerufen wird, einen Aufruf absetzen, der die gewünschte Funktionalität aus Deiner Logik- (auch Domänen-)Schicht aufruft.Sophus hat geschrieben: Und was mich auch interessiert. Wie verbindet man sein Programm und die GUI?
Das ist schnell beantwortet: Jede Anwendung, die ein GUI zur Laufzeit zwingend erfordert, ist "schlecht" geschrieben. In der Trennung von Logik und GUI liegt doch gerade der Sinn. Wenn deine Anwendung diesem Muster folgt, kannst du hinterher ohne Probleme die GUI anpassen bzw. sogar komplett austauschen.Hellstorm hat geschrieben:Was bringen einem Konsolenanwendungen, wenn man für sich selber keinen Einsatzweck hat und dann überhaupt nicht programmieren würde?
Naja, aber vielleicht möchte man ja gerade GUI-Anwendungen schreiben, um etwas irgendwie grafisch einfach zugänglich zu haben.Madmartigan hat geschrieben:Das ist schnell beantwortet: Jede Anwendung, die ein GUI zur Laufzeit zwingend erfordert, ist "schlecht" geschrieben. In der Trennung von Logik und GUI liegt doch gerade der Sinn. Wenn deine Anwendung diesem Muster folgt, kannst du hinterher ohne Probleme die GUI anpassen bzw. sogar komplett austauschen.Hellstorm hat geschrieben:Was bringen einem Konsolenanwendungen, wenn man für sich selber keinen Einsatzweck hat und dann überhaupt nicht programmieren würde?